2014-12-06 29 views
0

我有兩個表Mysql的連接表的結果作爲一個行

PRJ

id | ptitle 
1 | prj111 
2 | prj222 

prjflow

id | pid | paction | pactiontxt 
1 | 1 | 1 |  man1 
2 | 1 | 1 |  man2 
3 | 1 | 2 |  woman1 
4 | 1 | 1 |  man3 

,我想這樣的輸出:

輸出

ptitle | men  | women 
prj111 | man1,men3 | woman1 

我寫這篇文章的查詢:

SELECT prj.ptitle 
    , GROUP_CONCAT(pflow1.pactiontxt) men 
    , GROUP_CONCAT(pflow2.pactiontxt) women 
    FROM prj 
    JOIN prjflow pflow1 
    ON prj.id = pflow1.pid 
    AND pflow1.paction = 1 
    JOIN prjflow pflow2 
    ON prj.id = pflow2.pid 
    AND pflow2.paction = 2; 

但輸出是:

ptitle | men  | women 
prj111 | man1,men3 | woman1,woman1 

我的查詢時,男人和女人的行數已經等於,工作正常 但 我想在任何情況下工作。

非常感謝 和原諒我的英語寫作

+0

但是,爲什麼,哦,爲什麼? :-( – Strawberry 2014-12-06 12:48:00

+1

爲什麼man2在結果集中缺失? – Strawberry 2014-12-06 12:56:56

回答

3

只需使用條件彙總:

SELECT prj.ptitle, 
     GROUP_CONCAT(CASE WHEN prjflow.paction = 1 THEN prjflow.pactiontext END ORDER BY prjflow.id) as men, 
     GROUP_CONCAT(CASE WHEN prjflow.paction = 2 THEN prjflow.pactiontext END ORDER BY prjflow.id) as women 
FROM prj JOIN 
    prjflow 
    ON prj.id = prjflow.pid 
GROUP BY prj.ptitle; 

這也將修復兩次與查詢潛在的問題。首先是表現。如果某些標題中有大量的男性和女性,則查詢必須處理笛卡爾產品。其次是語義。如果有些頭銜有男人而不是男人,女人或沒有男人的女人,那麼這兩個聯合會將他們過濾掉。

Here是一個演示它的SQL小提琴。

請注意建議的輸出看起來與輸入數據不一致。這將產生輸出:

ptitle | men   | women 
prj111 | man1,man2,men3 | woman1 

我看不出有任何合理的方式排除列表man2,所以我認爲這是一個錯字。

+0

這是我的低調。我不打算評論是無益的。我留下了評論,因爲我不想成爲匿名downvoter,並想指出錯誤。但是你是對的,問題通過這個查詢來解決。我錯了(第一次是!!--))評論刪除,回覆upvoted。 – GolezTrol 2014-12-06 13:47:36

+0

謝謝。非常好,簡單 – Alireza 2014-12-06 16:04:34

0

的「速戰速決」將在group_concat聚合使用distinct

SELECT 
    prj.ptitle, 
    group_concat(distinct pflow1.pactiontxt) AS men, 
    group_concat(distinct pflow2.pactiontxt) AS women 
FROM prj 
JOIN prjflow AS pflow1 ON (prj.id = pflow1.pid AND pflow1.paction = 1) 
JOIN prjflow AS pflow2 ON (prj.id = pflow2.pid AND pflow2.paction = 2) 
GROUP BY 
    prj.ptitle -- Officially you'll need this as well, although MySQL is quite forgiving. 

但查詢還是使用兩個連接,並如果某個項目沒有男性或女性,甚至會失敗。

所以爲了解決這個問題,你可以使用子查詢編寫查詢。這樣,你不需要加入distinctgroup by,並且當一個物品根本沒有男人或者沒有女人時,查詢也可以工作。

SELECT 
    prj.ptitle, 
    (SELECT group_concat(pflow1.pactiontxt) FROM prjflo pflow1 
    WHERE prj.id = pflow1.pid AND pflow1.paction = 1) AS men, 
    (SELECT group_concat(pflow2.pactiontxt) FROM prjflo pflow2 
    WHERE prj.id = pflow2.pid AND pflow2.paction = 2) AS women 
FROM prj 
+0

有沒有更好的方法? – Strawberry 2014-12-06 12:49:34

+0

噢,有;-) – Strawberry 2014-12-06 12:57:52

相關問題