Froschs Blog

Computer und was das Leben sonst noch so zu bieten hat

Zur Website | Impressum

Kleine Diskussion mit MariaDB

8. Oktober 2022 um 17:43 Uhr von Atari-Frosch

Ich stand grad mal wieder auf dem Schlauch.

 MariaDB [piwigodb]> show columns from pwg_categories;
 +---------------------------+-----------------------------+------+-----+---------------------+
 | Field                     | Type                        | Null | Key | Default             |
 +---------------------------+-----------------------------+------+-----+---------------------+
 | id                        | smallint(5) unsigned        | NO   | PRI | NULL                |
 | name                      | varchar(255)                | NO   |     |                     |
 | id_uppercat               | smallint(5) unsigned        | YES  | MUL | NULL                |
 | comment                   | text                        | YES  |     | NULL                |
 | dir                       | varchar(255)                | YES  |     | NULL                |
 | rank                      | smallint(5) unsigned        | YES  |     | NULL                |
 | status                    | enum('public','private')    | NO   |     | public              |
 | site_id                   | tinyint(4) unsigned         | YES  |     | NULL                |
 | visible                   | enum('true','false')        | NO   |     | true                |
 | representative_picture_id | mediumint(8) unsigned       | YES  |     | NULL                |
 | uppercats                 | varchar(255)                | NO   |     |                     |
 | commentable               | enum('true','false')        | NO   |     | true                |
 | global_rank               | varchar(255)                | YES  |     | NULL                |
 | image_order               | varchar(128)                | YES  |     | NULL                |
 | permalink                 | varchar(64)                 | YES  | UNI | NULL                |
 | lastmodified              | timestamp /* mariadb-5.3 */ | NO   | MUL | current_timestamp() |
 | external_reference        | varchar(255)                | YES  |     | NULL                |
 +---------------------------+-----------------------------+------+-----+---------------------+

Das hier ist eine Datenbank-Tabelle aus der MariaDB-Datenbank von Piwigo. Das habe ich ja auf meiner Media-Site als Webanwendung installiert. (Die Spalte „Extra“ habe ich hier hinten weggenommen, weil die Tabelle sonst ein wenig zu breit geworden wäre.)

Piwigo erlaubt die Schachtelung von Alben. So habe ich zum Beispiel für jedes Jahr ein übergeordnetes Jahresalbum angelegt, unter dem dann die Fotos zu verschiedenen Ereignissen dieses Jahres in Unteralben zusammengefaßt sind. Diese können nochmals Unteralben haben, wenn ich beispielsweise eine mehrtägige Reise dokumentiere und für jeden Tag ein separates Unteralbum im Unteralbum der Reise anlege.

Ich wollte nun für ein neues Modul in meinem Website-Builder htmlglue die Namen aller Fotoalben abfragen, die kein übergeordnetes Album haben, also auf höchster Ebene stehen (und öffentlich sichtbar sind). Die diesen Alben untergeordneten Alben würde ich danach erst rausziehen. Ziel ist eine Liste aller Alben mitsamt ihrer Unteralben, bei der die Unteralben direkt unter den übergeordneten stehen.

(Nicht irritieren lassen, ich bin da anfangs auch dran hängengeblieben: Piwigo nennt seine Alben intern „categories“.)

 MariaDB [piwigodb]> select name from pwg_categories where id_uppercat = NULL;
 Empty set (0.000 sec)

Die Antwort kann einklich nich' sein, denn da stehen derzeit 51 Alben auf der obersten Ebene.

Mit 0 oder null statt NULL bekomme ich das gleiche Ergebnis.

Der Witz ist, daß ich in einem Python-Script, das ebenfalls zu htmlglue gehört, schon einmal mit diesen Daten gearbeitet habe, allerdings interessierte mich da nur der volle Name des Albums zu einem vorher ausgewählten Foto. In Python kann ich id_uppercat gegen None vergleichen, was meiner Kenntnis nach dem NULL in mySQL entspricht.

Nun brauchte ich aber den Vergleich direkt in SQL, denn ich will ja mit einem SQL-Statement alle Alben mit dieser Eigenschaft abrufen und nicht nur herausfinden, ob ein bestimmtes Album ein übergeordnetes Album hat.

Die Lösung fand ich schließlich im MariaDB-Tutorial: MariaDB Is Null.

Also: Im Statement muß der Abgleich mit is gemacht werden, nicht mit =. Somit sieht mein Statement so aus:

 MariaDB [piwigodb]> select name from pwg_categories where id_uppercat is null;

… und schon purzeln alle 51 Albumnamen der obersten Ebene auf den Bildschirm.

Kaum macht man's richtig, funktioniert's. Immer wieder erstaunlich. 🤓


History

2 Kommentare zu “Kleine Diskussion mit MariaDB”

  1. Portabler Assembler quakte:

    Wie sieht das eigentlich aus wenn ich eine Spalte deren Wert Null ist mit sich selbst vergleiche ? Ich mein das müsste doch im Gegensatz zu anderen möglichen Werten dann immer False geben, oder ? Wäre doch ein eleganter Hack. Bei Floating Point Zahlen gibt’s sowas ähnliches, bzw. der Stellevertreter-Wert für alles Unsinnige heiß da NaN, was für Not A Number steht (https://de.wikipedia.org/wiki/NaN). Wenn ich NaN mit sich selbst vergleiche krieg ich dementsprechend immer einen falschen Wert; mit sowas wie „if( !(x == x) )“ kann man dann sehr effizient auf NaN testen, denn das gibt für keinen anderen Wert wahr. Wäre cool wenn das analog auch für SQL-Spalten gelten würde.


  2. Atari-Frosch quakte:

    @Portabler Assembler: Hab ich noch nie probiert, und der Sinn erschließt sich mir nicht. Aber es hindert Dich ja niemand daran, das mal selbst zu testen.


Kommentieren

Bitte beachte die Kommentarregeln!

XHTML: Du kannst diese Tags verwenden: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>