MySQL

Journal-Tags aus Exif Daten

Seit einer Weile speichere ich auch die Exif Daten der Fotos in der Datenbank und nun habe ich mir mal die Zeit genommen und für jeden Post mit einem Foto, das die Infos hat, Tags für Kamera und Objektiv zu generieren. Das fängt leider erst im Oktober 2021 an. Das sind nicht einmal 2 Jahren von insgesamt 22 Jahren.

Ich bin mir nicht sicher, ob ich den Rest manuell taggen möchte...

Hier sind auf jeden Fall die nigelnagelneuen Tags:

Und natürlicherweise auch in der Wolke zu finden.

SQL zum Erstellen der Relationen zwischen Tag und Post ist dank JSON_EXTRACT relativ einfach:

REPLACE INTO journal_entry_tag (entryId, tagId) 
  SELECT DISTINCT je.id, 494  
  FROM journal_image ji 
  INNER JOIN journal_entry je ON je.content LIKE concat('%',ji.url,'%') 
  WHERE REPLACE(JSON_EXTRACT(ji.exif, '$.lens'),'"','') LIKE 'Zeiss Planar%'; 
-- wobei 494 die Id vom Tag "Zeiss Planar T* 1.4/50 ZF.2" ist 

Da soll mal jemand sagen: ein Blog wäre kein Hobby ;)

Wieviel Spaß ein kleiner Query doch machen kann.

Wieviel Spaß ein kleiner Query doch machen kann. Auf den Tag-Seiten gibt es im Kopf nun einer Liste verwandter Tags. Was mich allerdings immer Wieder daran erinnert, dass die Tags aufgrund des Alters vom Blog etwas ungepflegt sind. Aber die langen Winterabende werden kommen.

SELECT t.*, COUNT(*) AS anz
FROM journal_tag t 
LEFT JOIN journal_entry_tag et ON et.tagId = t.id 
LEFT JOIN journal_entry e ON et.entryId = e.id
WHERE 
  et.entryId IN (
    SELECT entryId FROM journal_entry_tag WHERE tagId = :tagid
  ) AND et.tagId != :tagid AND t.scheme = 'tag'
  AND e.status = 'published'
GROUP BY t.id 
-- HAVING anz > 1 Wenn man mag
ORDER by anz DESC;

Order by Enum

Jetzt bin ich seit gut einer Millionen Jahre Entwickler und arbeite mit SQL Datenbanken. Aber jetzt ist mir erst aufgefallen, dass bei einem ORDER BY auf ein Enum Feld nicht alphanumerisch sortiert wird sondern nach der Reihenfolge in der Definition des Enum.

SELECT * FROM table ORDER BY CAST(col AS CHAR);

vs.

SELECT * FROM table ORDER BY col;

wenn

col enum('b','a') NOT NULL DEFAULT 'b'

MySQL Next Insert ID

Wesentlich eleganter als einen leeren Datensatz einzufügen und dann die lastInsertId zu nehmen, ist es den Status der Tabelle abzufragen, denn der enthält die nächste Auto Increment Id.

SHOW TABLE STATUS WHERE name = 'yourTableName'; 

Liefert im Result den Wert in Feld Auto_increment.

SELECT `AUTO_INCREMENT` FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'YourDataBaseName' 
AND TABLE_NAME = 'yourTableName';

Liefert dann nur den einen Wert.

Querious

Ja, irgendwo war Heute ein Tag der Veränderung. Nachdem ich nun über etliche Jahre Sequel Pro als grafisches Frontend für MySQL benutzt habe, kam ich in jüngster Vergangenheit nicht umher eine gewisse Stagnation in der Weiterentwicklung zu beobachten. Erst gab es noch regelmäßige Nightlies, die mal mehr und mal weniger gut funktioniert haben. Aber seit einer Weile scheint es auch damit vorbei zu sein. Zu einem Augenblick da die Stabilität auch noch arg zu wünschen übrig lässt. Also musste langsam mal eine Alternativ her. 

TablePlus war die erste Option. Die Liste der unterstützten DB System ist spannend. Dankenswerter Weise ist auch MongoDB darunter. Aber leider ist TablePlus für meine Begriffe etwas zu fancy und auch irgendwie ein wenig anstrengend. 

Die zweite Alternative war Querious 2. Ich mach’s kurz. Querious ist schlichter und einfacher. Und die Shortcuts haben mich überzeugt. 

Als Hintergrund: ich benutze das Frontend nicht um Strukturen zu entwerfen sondern idR. um mal schnell einen Blick auf eine DB zu werfen und Daten zu analysieren. Und vielleicht mal den einen oder anderen Datensatz zu ändern oder einen Query für den einmaligen Gebrauch zu schreiben. Raw SQL Queries im Application Context empfinde ich hingegen als ein No-Go.