Trotz JOIN nur eine Zeile gewünscht
Linuchs
- datenbank
Hallo,
ich habe eine MySQL-Tabelle mit Vereinen und eine Tabelle mit Beziehungen zwischen den Vereinen. Ein Chor kann Mitglied sein in 0..n Dachorganisationen (Sängerkreis, Landes-, Bundesverband).
Wenn ich nun die Dachorganisationen pro Chor mit LEFT JOIN dazuhole, kann ich merere Zeilen pro Chor bekommen. Die Darstellung in der HTML-Tabelle soll jedoch in derselben Zeile, verschiedene Spalten erfolgen: Chorverzeichnis - siehe z.B. ganz unten Lady Pirates, Mitglied in zwei Organisationen.
Mein SQL:
(
SELECT
adr1.id
,adr1.gewerbeart
,adr1.firma1
,adr1.land_kz
,adr1.plz
,adr1.ort
,adr1.homepage
,adr1.anred
,adr1.vname
,adr1.nname
,adr1.funktion
,adr1.last_login
,'1' remso_mitglied
,IF (vbm1.verband_id='707',1,0) marinebund_mitglied
,IF (vbm1.verband_id='785',1,0) issa_mitglied
,IF (vbm1.verband_id='834',1,0) shantynederland_mitglied
FROM bia_adressen adr1
LEFT JOIN bia_verband_mitglied vbm1
ON vbm1.mitglied_id = adr1.id
WHERE SUBSTRING(adr1.gewerbeart,6,1) = 'S'
AND adr1.loe_kz = 0
) UNION (
SELECT
itr1.id
,itr1.gewerbeart
,itr1.firma1
,itr1.land_kz
,itr1.plz
,itr1.ort
,itr1.homepage
,itr1.anred
,itr1.vname
,itr1.nname
,itr1.funktion
,'0' last_login
,'0' remso_mitglied
,IF (vbm1.verband_id='707',1,0) marinebund_mitglied
,IF (vbm1.verband_id='785',1,0) issa_mitglied
,IF (vbm1.verband_id='834',1,0) shantynederland_mitglied
FROM bia_interessenten itr1
LEFT JOIN bia_verband_mitglied vbm1
ON vbm1.interessent_id = itr1.id
WHERE SUBSTRING(itr1.gewerbeart,6,1) = 'S'
AND itr1.loe_kz = 0
#GROUP BY itr1.id
)
ORDER BY land_kz, plz, ort
Das GROUP BY führt nicht zum Ziel, es "verschluckt" die Informationen des JOIN.
Linuchs
Hi,
Wenn ich nun die Dachorganisationen pro Chor mit LEFT JOIN dazuhole, kann ich merere Zeilen pro Chor bekommen. Die Darstellung in der HTML-Tabelle soll jedoch in derselben Zeile, verschiedene Spalten erfolgen
Entweder machst du das bei der Ausgabe, indem du einen simplen Gruppenwechsel implementierst, oder du schaust dir GROUP_CONCAT an (dazu aber die Hinweise bzgl. Längen-Limit im Handbuch beachten).
MfG ChrisB
... oder du schaust dir GROUP_CONCAT an (dazu aber die Hinweise bzgl. Längen-Limit im Handbuch beachten).
Funktioniert nicht.
Mein SQL:
SELECT
adr1.id
,adr1.gewerbeart
,adr1.firma1
,adr1.land_kz
,adr1.plz
,adr1.ort
,adr1.homepage
,adr1.anred
,adr1.vname
,adr1.nname
,adr1.funktion
,adr1.email
,'0' last_login
,'0' remso_mitglied
,IF (vbm1.verband_id='707',1,0) marinebund_mitglied
,IF (vbm1.verband_id='785',1,0) issa_mitglied
,IF (vbm1.verband_id='834',1,0) shantynederland_mitglied
,GROUP_CONCAT(vbm1.verband_id SEPARATOR ',') verbaende
FROM bia_interessenten adr1
LEFT JOIN bia_verband_mitglied vbm1
ON vbm1.interessent_id = adr1.id
WHERE SUBSTRING(adr1.gewerbeart,6,1) = 'S'
AND adr1.loe_kz = 0
GROUP BY adr1.id
Wenn ich das in phpmyadmin eingebe, kommt für verbaende [BLOB - 3Bytes], [BLOB - 7Bytes] oder [BLOB - 0Bytes] heraus.
7 Bytes sieht gut aus, könnten zwei dreistellige Werte plus Komma sein. Aber wie komme ich an die Werte?
Linuchs
Jetzt hab ich's:
statt
GROUP_CONCAT(vbm1.verband_id SEPARATOR ',') verbaende
muss es heissen
GROUP_CONCAT(CAST(vbm1.verband_id AS CHAR(4)) SEPARATOR ',') verbaende
Und dann kommt richtig 834,785 heraus.
Danke für den Tipp.
Linucchs
Hi,
statt
GROUP_CONCAT(vbm1.verband_id SEPARATOR ',') verbaendemuss es heissen
GROUP_CONCAT(CAST(vbm1.verband_id AS CHAR(4)) SEPARATOR ',') verbaendeUnd dann kommt richtig 834,785 heraus.
Ob es das „muss“, da bin ich nicht sicher – auch als Blob hättest du es vermutlich in der anschließenden Programm-Logik problemlos verarbeiten können.
Dir zunächst nur [BLOB - 7Bytes] *anzuzeigen*, ist eine Eigenart von phpMyAdmin – der geht zunächst mal davon aus, dass ein Blob tatsächlich binäre Daten enthält, die für den Nutzer weniger interessant sind bzw. ggf. auch gar nicht sinnvoll als Text angezeigt werden können. Aber über die Optionen über der Ergebnis-Anzeige kannst du angeben, dass du auch den Inhalt von Blobs als Text angezeigt haben willst.
MfG ChrisB