Linuchs: Trotz JOIN nur eine Zeile gewünscht

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

  1. 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

    --
    Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/
    1. ... 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

      1. 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

        1. Hi,

          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.

          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

          --
          Autocomplete has spoiled me to a point where it happens every so often that I encounter a CAPTCHA, and I just type in the first character … and then wait for the rest of the code to be automatically suggested :/