Andreas: Abfrage über mehrere zeilen zusammenfassen

Hallo Ich hab mit einer Abfrage über mehrere Tabellen das problem, dass ich eines der felder zu einem feld mit aneinandergehängtem inhalt zusammenfassen möchte...
die abfrage geht über die Tabellen:Abteilungen, Mitarbeiter und zur verbindung Mitarbeiter_ABteilungen als antwort brauche ich den mitarbeiter namen... und ein "Feld" mit den aneinandergehängten Abteilungsnamen, die Abfrage sieht bisher so aus:
$qry = $db_obj->query("SELECT distinct tbl_Mitarbeiter.id, tbl_Mitarbeiter.Name,
    tbl_Mitarbeiter.Vorname, tbl_Abteilungen.Name AS Abteilung
    FROM tbl_Mitarbeiter, tbl_Abteilungen, tbl_Mitarb_Abt
    WHERE tbl_Mitarbeiter.id = tbl_Mitarb_Abt.FS_Mitarb
    AND tbl_Abteilungen.id = tbl_Mitarb_Abt.FS_Abt
    AND tbl_Mitarbeiter.EAN = '" . $kennung . "'");
mit dem zusammenfassen komme ich allerdings leider nicht weiter (habe dazu auch in verschiedenen Dokumentationen/Foren nichts gefunden) meine vermutung wäre es irgendwie mit distinct,group by, group_concat() zu machen hat aber bisher nichts funktioniert.
wäre nett wenn mir da jemand weiter helfen könnte
gruss andreas

  1. Hallo Ich hab mit einer Abfrage über mehrere Tabellen das problem, dass ich eines der felder zu einem feld mit aneinandergehängtem inhalt zusammenfassen möchte...

    Bei MS SQL Server geht das mit

      
    SELECT  
     DF1 + DF2 AS DF12  
    FROM  
     DT1  
    
    

    Lies Dir mal die Stringfunktionen an.

    1. Hallo Ich hab mit einer Abfrage über mehrere Tabellen das problem, dass ich eines der felder zu einem feld mit aneinandergehängtem inhalt zusammenfassen möchte...

      Bei MS SQL Server geht das mit

      SELECT
      DF1 + DF2 AS DF12
      FROM
      DT1

      
      >   
      > Lies Dir mal die Stringfunktionen an.  
      >   
      
      Danke f[r die schnellen antworten allerdings brauche ich keine verbindung von 2 verschiedenen spalten sondern m;chte mehrere zeilen yusammenfassen etwa so  
      wen mueller rechte bei edv und versand hat m;chte ich nicht 2 mal  
      id name vorname und eine der abteilungen kriegen sondern 1 mal  
      id name ... abteilung1 abteilung2 abteilung3  
      mit group concat hatte ich es schon versucht hat aber zu fehlermeldungen gefuehrt  
      gruss andreas
      
  2. hi,

    und ein "Feld" mit den aneinandergehängten Abteilungsnamen

    MySQL kennt bspw. GROUP_CONCAT. Ggf. in einer Subquery einsetzen.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. hi,

      und ein "Feld" mit den aneinandergehängten Abteilungsnamen

      MySQL kennt bspw. GROUP_CONCAT. Ggf. in einer Subquery einsetzen.

      gruß,
      wahsaga

      »»
      hi
      danke fuer den link allerdings finde ich da auch keinen hinweis darauf was ich falsch gemacht haben koennte siehe abfrage weiter oben, die schliessende klammer vor AS zu setzen habe ich auch versucht bringt aber auch nichts...
      gruss andreas

  3. Hallo Andreas,

    group_concat() zu machen hat aber bisher nichts funktioniert.

    dann machst Du entweder etwas falsch oder nutzt nicht MySQL.
    Bitte poste Dein Statement mit GROUP_CONCAT() und gib das von Dir verwendete
    Datenbankmanagementsystem (DBMS) inklusive Version an.

    Freundliche Grüße

    Vinzenz

    1. Hallo Andreas,

      group_concat() zu machen hat aber bisher nichts funktioniert.

      dann machst Du entweder etwas falsch oder nutzt nicht MySQL.
      Bitte poste Dein Statement mit GROUP_CONCAT() und gib das von Dir verwendete
      Datenbankmanagementsystem (DBMS) inklusive Version an.

      Freundliche Grüße

      Vinzenz

      Hallo ok ich benutze mysql mit php5 und einbindung ueber mysqli und ich habe es so versucht
      $qry = $db_obj->query("SELECT distinct tbl_Mitarbeiter.id, tbl_Mitarbeiter.Name,
          tbl_Mitarbeiter.Vorname, group_concat(tbl_Abteilungen.Name AS Abteilung)
          FROM tbl_Mitarbeiter, tbl_Abteilungen, tbl_Mitarb_Abt
          WHERE tbl_Mitarbeiter.id = tbl_Mitarb_Abt.FS_Mitarb
          AND tbl_Abteilungen.id = tbl_Mitarb_Abt.FS_Abt
          AND tbl_Mitarbeiter.EAN = '" . $kennung . "'");

      ps sorry wegen rechtschreibfehlern oder fehlenden sonderzeichen meine tastatur hat sich irgendwie auf amerikanisch umgestellt ka wieso, aber dass guck ich mir spaeter an...
      gruss andreas

      1. Hallo Andreas,

        dann machst Du entweder etwas falsch oder nutzt nicht MySQL.
        Bitte poste Dein Statement mit GROUP_CONCAT() und gib das von Dir verwendete

        Hallo ok ich benutze mysql mit php5 und einbindung ueber mysqli und ich habe es so versucht

        SELECT distinct tbl_Mitarbeiter.id, tbl_Mitarbeiter.Name,
            tbl_Mitarbeiter.Vorname, group_concat(tbl_Abteilungen.Name AS Abteilung)
            FROM tbl_Mitarbeiter, tbl_Abteilungen, tbl_Mitarb_Abt
            WHERE tbl_Mitarbeiter.id = tbl_Mitarb_Abt.FS_Mitarb
            AND tbl_Abteilungen.id = tbl_Mitarb_Abt.FS_Abt
            AND tbl_Mitarbeiter.EAN = '" . $kennung . "'");

        ich versuche mal, Dein Statement lesbar und für mich verständlich zu gestalten. Dazu nutze ich die explizite Join-Syntax und Alias-Namen.

        SELECT  
            m.id,  
            m.Name,  
            m.Vorname,  
            GROUP_CONCAT(a.Name) AS Abteilungen,  -- hier war was falsch  
        FROM  
            tbl_Mitarbeiter m  
        INNER JOIN tbl_Mitarb_Abt ma  
        ON m.id = ma.FS_Mitarb  
        INNER JOIN tbl_Abteilungen  
        ON ma.FS_Abt = a.id  
        WHERE m.EAN = '<irgendein wert>'  
        GROUP BY                                  -- die Spalten nach denen gruppiert  
            m.id,                                 -- wird, sollte man nicht vergessen  
            m.Name,  
            m.Vorname  
        
        

        sollte eigentlich das von Dir gewünschte zurückliefern.

        Tipp: Teste SQL-Statements zuerst mit dem Client Deiner Wahl, z.B. phpMyAdmin
        oder MySQL-Query-Browser oder was auch immer, bevor Du die Statements mit einer Programmiersprache wie PHP zusammenbaust.

        Noch ein Tipp: Wenn Du schon mysqli verwendest, dann empfehle ich, dass Du Dir
        den Luxus von prepared Statements gönnst:

        http://www.php.net/manual/de/function.mysqli-stmt-prepare.php
        http://www.php.net/manual/de/function.mysqli-stmt-bind-param.php
        http://www.php.net/manual/de/function.mysqli-stmt-execute.php

        und weitere dort verlinkte Funktionen

        Freundliche Grüße

        Vinzenz

        1. Hallo Andreas,

          dann machst Du entweder etwas falsch oder nutzt nicht MySQL.
          Bitte poste Dein Statement mit GROUP_CONCAT() und gib das von Dir verwendete

          Hallo ok ich benutze mysql mit php5 und einbindung ueber mysqli und ich habe es so versucht

          SELECT distinct tbl_Mitarbeiter.id, tbl_Mitarbeiter.Name,
              tbl_Mitarbeiter.Vorname, group_concat(tbl_Abteilungen.Name AS Abteilung)
              FROM tbl_Mitarbeiter, tbl_Abteilungen, tbl_Mitarb_Abt
              WHERE tbl_Mitarbeiter.id = tbl_Mitarb_Abt.FS_Mitarb
              AND tbl_Abteilungen.id = tbl_Mitarb_Abt.FS_Abt
              AND tbl_Mitarbeiter.EAN = '" . $kennung . "'");

          ich versuche mal, Dein Statement lesbar und für mich verständlich zu gestalten. Dazu nutze ich die explizite Join-Syntax und Alias-Namen.

          SELECT

          m.id,
              m.Name,
              m.Vorname,
              GROUP_CONCAT(a.Name) AS Abteilungen,  -- hier war was falsch
          FROM
              tbl_Mitarbeiter m
          INNER JOIN tbl_Mitarb_Abt ma
          ON m.id = ma.FS_Mitarb
          INNER JOIN tbl_Abteilungen
          ON ma.FS_Abt = a.id
          WHERE m.EAN = '<irgendein wert>'
          GROUP BY                                  -- die Spalten nach denen gruppiert
              m.id,                                 -- wird, sollte man nicht vergessen
              m.Name,
              m.Vorname

          
          >   
          > sollte eigentlich das von Dir gewünschte zurückliefern.  
          >   
          > Tipp: Teste SQL-Statements zuerst mit dem Client Deiner Wahl, z.B. phpMyAdmin  
          > oder MySQL-Query-Browser oder was auch immer, bevor Du die Statements mit einer Programmiersprache wie PHP zusammenbaust.  
          >   
          > Noch ein Tipp: Wenn Du schon mysqli verwendest, dann empfehle ich, dass Du Dir  
          > den Luxus von prepared Statements gönnst:  
          >   
          > <http://www.php.net/manual/de/function.mysqli-stmt-prepare.php>  
          > <http://www.php.net/manual/de/function.mysqli-stmt-bind-param.php>  
          > <http://www.php.net/manual/de/function.mysqli-stmt-execute.php>  
          >   
          > und weitere dort verlinkte Funktionen  
          >   
          >   
          > Freundliche Grüße  
          >   
          > Vinzenz  
            
          Hallo vielen Dank für die ausführlichen Antworten und die links (werde ich mir heute abend auf jedenfall nochmal genauer ansehen) ;)  
          die sql statements habe ich mit php my admin getestet (mit dem querry-browser habe ich leider keine verbindung auf den debian-server herstellen können, kenne mich damit noch nicht aus)  
          leider funktionierte bisher leider noch keine bei der von dir vorgeschlagenen (sehe ich eigentlich auch keine fehler) und kriege diese meldung:  
          MySQL meldet: Dokumentation  
          #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FROM  tbl\_Mitarbeiter m  INNER JOIN tbl\_Mitarb\_Abt ma  ON m . id = ma . FS\_Mitar' at line 1 
          
          1. sorry das genaue (php myadmin) sql statement wurde irgendwie nicht mitkopiert

            SQL-Befehl: Dokumentation

            SELECT m.id, m.Name, m.Vorname, GROUP_CONCAT( a.Name ) AS Abteilungen,
            FROM tbl_Mitarbeiter m
            INNER JOIN tbl_Mitarb_Abt ma ON m.id = ma.FS_Mitarb
            INNER JOIN tbl_Abteilungen ON ma.FS_Abt = a.id
            WHERE m.EAN = '86'
            GROUP BY m.id, m.Name, m.Vorname
            LIMIT 0 , 30

            (ps nr 86 muesste eigentlich funktionieren...)

            1. Hallo
              Ich habe zwar noch einen fehler gefunden (tbl Abteilungen war nicht als a definiert), die behebung hat allerdings leider immer noch nichts gebracht...
              gruss andreas

              1. Hallo Ich habe jetzt die korrekte Abfrage heraus bekommen:

                SELECT m.id, m.Name, m.Vorname, Group_concat( a.Name ) AS Abteilung
                FROM tbl_Mitarbeiter m, tbl_Abteilungen a, tbl_Mitarb_Abt ma
                WHERE m.id = ma.FS_Mitarb
                AND a.id = ma.FS_Abt
                AND m.EAN = '86'
                GROUP BY m.id

                das komma hinter AS Abteilung war einfach nur zu viel ;)
                danke für die hilfe.
                gruss andreas

    2. dann machst Du entweder etwas falsch oder nutzt nicht MySQL.
      Bitte poste Dein Statement mit GROUP_CONCAT() und gib das von Dir verwendete
      Datenbankmanagementsystem (DBMS) inklusive Version an.

      Hallo
      die genaue version ist
      MySQL - 5.0.24a-Debian_2.dotdeb.0-log
      gruss andreas