2017-07-11 27 views
0

我讀,顯示如何製造出來的一個的幾排的問題Combine multiple rows into one row MySQL選擇語句一行的結果。 SQL Fiddle with Demo也運行良好。在這個問題中,有兩個表格:t1t2。我的問題有三個表,我已經簡化了這個問題:將多行三個表成一排在MySQL

語言

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

languages_have_persons

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

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

我想要做的是將這些表格類似地組合起來,但是現在我幾個小時都沒有這樣做。這是我最後一次嘗試:

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; 

錯誤消息如下:

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 

我也嘗試過其他方法,但什麼都沒有正確的語法。我要的是結果如下:

語言

ID name 
4  German 
5  English 

language_have_persons

Languages_ID Persons_ID  
    4    2 
    5    1 
    5    2 

ID firstName lastName 
1  Joe   Frazier 
2  Arnold  Schwarzenegger 

我從正確的SELECT語句想到的是像

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

你在上面的SQL語法看到錯誤?如果不是,你知道如何解決它嗎?

謝謝你的幫助!

+1

您必須在'CONCAT_WS'之前添加一個逗號。 – GhostGambler

+0

謝謝!就是這樣,但我看不到它,並嘗試了很多錯誤的陳述。 – Sae1962

+0

這種格式化查詢的重點正是爲了避免這種錯誤 - 做得很好! – Strawberry

回答

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 爲了您進一步查詢,你可以試試下面。

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; 

您可以嘗試以上查詢。

希望這會幫助你。

+0

非常感謝你幫助盲人馬安! ; -D – Sae1962

+0

@ Sae1962如果問題得到解決,您可以將其標記爲已接受。 –

+0

還有一個問題。我得到所有人的所有語言,但我只會看到這個人真正知道的每行的語言。目前,即使不懂德語,查詢也會返回所有人的德語,英語。 – Sae1962

0

在另外一個網站,我有另外一個討論,在同事找到了解決辦法,這是

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; 

所以,問題是適當回答的問題。

相關問題