2017-07-11 5 views
0

Kombinieren Ich lese die Frage Combine multiple rows into one row MySQL, die zeigt, wie aus mehreren Zeilen einer SELECT Anweisung ein Ergebnis mit einer einzigen Zeile. Die SQL Fiddle with Demo läuft auch gut. In dieser Frage gibt es zwei Tabellen: t1 und t2. Mein Problem hat drei Tabellen, die ich für diese Frage vereinfacht:Mehrere Zeilen von drei Tabellen zu einer Zeile in MySQL

Tabelle Sprachen:

ID    INT(11)   NOT NULL PRIMARY_KEY 
name   VARCHAR(255) NOT NULL UNIQUE 

Tabelle languages_have_persons:

Languages_ID INT(11)   NOT NULL PRIMARY_KEY 
Persons_ID INT(11)    NOT NULL  

Tabelle Personen:

ID    INT(11)   NOT NULL PRIMARY_KEY 
firstName  VARCHAR(255) NOT NULL 
lastName  VARCHAR(255) NOT NULL 

Was ich tun möchte, ist, diese Tabellen ähnlich zu kombinieren, aber ich versäume es jetzt seit mehreren Stunden. Hier ist mein letzter Versuch:

SELECT p1.ID 
    , p1.firstName 
    , p1.lastName 
    CONCAT_WS(', ' 
     , l2de.name 
     , l2en.name 
    ) 
    FROM 
     languages_have_persons AS lp, persons AS p1 
    LEFT JOIN languages AS l2de ON 
     l2de.ID = 4 -- German 
    LEFT JOIN languages AS l2en ON 
     l2en.ID = 5 -- English 
WHERE p1.ID = lp.Persons_ID 
ORDER BY lastName, firstName; 

Die Fehlermeldung lautet:

Fehler 
SQL-Befehl: Dokumentation 


SELECT p1.ID AS ID 
    , p1.firstName AS firstName 
    , p1.lastName AS lastName 
    CONCAT_WS(', ' 
     , l2de.name 
     , l2en.name 
    ) 
    FROM 
     languages_have_persons AS lp, persons AS p1 
    LEFT JOIN languages AS l2de ON 
     l2de.ID = 4  LEFT JOIN languages AS l2en ON 
     l2en.ID = 5 WHERE p1.ID = lp.Persons_ID 
ORDER BY lastName, firstName LIMIT 0, 25 
MySQL meldet: Dokumentation 

#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch 
nachschlagen bei '(', ' 
     , l2de.name 
     , l2en.name 
    ) 
    FROM 
     languages_have_persons AS lp, ' in Zeile 4 

ich auch andere Wege versucht, aber keiner hatte die richtige Syntax. Was ich als Ergebnis wollen, ist wie folgt:

Tabelle Sprache:

ID name 
4  German 
5  English 

Tabelle language_have_persons:

Languages_ID Persons_ID  
    4    2 
    5    1 
    5    2 

Tabelle Personen:

ID firstName lastName 
1  Joe   Frazier 
2  Arnold  Schwarzenegger 

Was ich von der richtigen Anweisung SELECT erwarten ist so etwas wie

firstName lastName   CONCAT_WS(… 
Joe   Frazier   English 
Arnold  Schwarzenegger German, English 

Haben Sie den Fehler in der SQL-Syntax oben sehen? Wenn nicht, weißt du, wie man es löst?

Vielen Dank für Ihre Hilfe!

+1

Sie müssen vor 'CONCAT_WS' ein Komma hinzufügen. – GhostGambler

+0

Vielen Dank! Das war es, aber ich konnte es nicht sehen und versuchte viele falsche Aussagen. – Sae1962

+0

Der Hauptpunkt der Formatierung von Abfragen auf diese Weise ist genau diese Art von Fehler zu vermeiden - so gut gemacht !!! – Strawberry

Antwort

2
SELECT p1.ID 
    , p1.firstName 
    , p1.lastName,<--------------------I had made change at this line 
    CONCAT_WS(', ' 
     , l2de.name 
     , l2en.name 
    ) 
    FROM 
     languages_have_persons AS lp, persons AS p1 
    LEFT JOIN languages AS l2de ON 
     l2de.ID = 4 -- German 
    LEFT JOIN languages AS l2en ON 
     l2en.ID = 5 -- English 
WHERE p1.ID = lp.Persons_ID 
ORDER BY lastName, firstName; 

OR Für Ihre weitere Abfrage können Sie unten versuchen.

SELECT p1.ID 
    , p1.firstName 
    , p1.lastName, 
    l2de.name 
    FROM 
    persons p1 
    INNER JOIN languages_have_persons lp on p1.ID=lp.Persons_ID 
    INNER JOIN language l2de on l2de.ID=lp.Languages_ID 
    WHERE l2de.ID IN(4,5) 
    ORDER BY lastName, firstName; 

Sie können oben Abfrage versuchen.

Hoffe, das wird Ihnen helfen.

+0

Vielen Dank, dass Sie A BLIND MAAAN geholfen haben! ;-D – Sae1962

+0

@ Sae1962 Wenn Ihr Problem gelöst ist, können Sie es als akzeptiert markieren .. !! –

+0

Es gibt noch ein Problem. Ich bekomme alle Sprachen für alle Personen, aber ich würde nur die Sprachen pro Zeile sehen, die diese Person wirklich kennt. Derzeit gibt die Abfrage für alle Personen "Deutsch, Englisch" zurück, auch wenn sie kein Deutsch sprechen. – Sae1962

0

Auf einer anderen Seite, hatte ich eine andere Diskussion, wo der Kollege die Lösung gefunden, die so

SELECT DISTINCT pl.ID 
    , firstName 
    , lastName 
    , languages 
FROM persons p 
    , (SELECT 
     lp.Persons_ID AS ID, 
     GROUP_CONCAT(DISTINCT l.name) AS languages 
    FROM languages l 
     , languages_have_persons lp 
    WHERE l.id = lp.Languages_ID 
    GROUP BY lp.Persons_ID 
    ) AS pl 
WHERE p.id = pl.id 
ORDER BY p.id; 

ist, wird die Frage RICHTIG BEANTWORTEN.

Verwandte Themen