dedlfix: Abfrage OpenGeoDB, postleitzahlen groupieren?

Beitrag lesen

Tach!

Dann schreibst du ein separates Statement

Bei WHERE?

Nein, ein komplett neues Statement. Das bleibt erstmal so lange eigenständig, bis es wie gewünscht läuft. Dann erst wird es wieder in der Haupt-Query eingebaut.

Ich habe es so gelösst:

Ich habe deinenRat mit GROUP_CONCAT() gefolgt, habe aber nichts gelöscht, und dann groupiert

Nein, das war nicht mein Rat, denn nun hast du ein Statement, das nur aufgrund einer MySQL-Gutmütigkeit funktioniert. Du gruppierst über ein einzelnes Feld, hast aber mehrere andere Felder in der SELECT-Klausel stehen. Aus welchem Datensatz der Gruppe soll nun die Information für diese Felder genommen werden? Bei aggregierten Daten (zusammengefasst durch Summenbildung oder ähnliches, und auch das GROUP_CONCAT()) ist das kein Problem. Und es ist auch kein Problem, wenn die Datensätze nur aufgrund des JOINS vervielfältigt werden.

Außerdem wird durch Joins dein Statement recht komplex. Correlated Subquerys mache es zwar nicht kleiner, aber dadurch werden die Teilabfragen in eigene Querys separiert. Und die kann man auch mal extrahieren und separat testen.

Es ist auch nicht notwendig, erst eine große Datenmasse aus vervielfältigten Datensätzen entstehen zu lassen, die man dann wieder eindampft. Correlated Subquerys können dabei helfen, die Übersicht zu bewahren und das Joinprodukt zu vermeiden. Diese Technik geht erst dann nicht mehr zu verwenden, wenn aus den anderen Tabellen mehr als ein Wert und ein Datensatz kommen sollen. Dann braucht man weiterhin Joins.

Das ist das Statement zum Testen der Postleitzahlenabfrage. Die id 42 hab ich mir ausgedacht, nimm da eine real existierende für den Test.

SELECT GROUP_CONCAT(text_val) FROM geodb_textdata WHERE text_type = 500300000 AND loc_id = 42;

Genauso kannst du die anderen Datenabfragen in eigene Statements auslagern:

SELECT text_val FROM geodb_textdata WHERE text_type = 500100000 AND loc_id = 42;
SELECT text_val FROM geodb_textdata WHERE text_type = 400300000 AND loc_id = 42;

Zusammengebaut sieht das dann so aus, wobei aus der 42 der Verweis auf die Haupt-Query geworden ist:

SELECT 

(SELECT GROUP_CONCAT(text_val) FROM geodb_textdata WHERE text_type = 500300000 /* Postleitzahl */ AND loc_id = gtv.loc_id) AS plz,

gtv.loc_id, 

(SELECT text_val FROM geodb_textdata WHERE text_type = 500100000 /* Name */ AND loc_id = gtv.loc_id) AS name,

(SELECT text_val FROM geodb_textdata WHERE text_type = 400300000 /* Typ */ AND loc_id = gtv.loc_id) AS typ

FROM geodb_textdata gtv
WHERE text_type = 400100000 /* Teil von */
AND text_val = '77690' /* loc_id des Bezirkes */

dedlfix.