2011-02-28 58 views
1

我有這個下面的查詢:Mysql的行轉換成列,優化查詢使用IF

SELECT a.rank AS rank, concat(m.prenom, ' ', m.nom) AS name, d.department 
FROM `0_area` AS a 
LEFT JOIN 0_member AS m ON a.user_id = m.id 
LEFT JOIN 0_depart AS d ON a.user_id = d.user_id 
WHERE a.sec_id = 2 
AND (a.rank = 'mod' OR a.rank = 'adm') 
AND d.department IN (75, 92) 

上面的查詢將返回我的三列,命名rank | name | department,它的工作,有一個單獨的行對於每個秩針對一個部門。

rank | name | department 

mod | Steven Smith | 75 
mod | Jeremy Roy  | 92 
adm | Vincent Jones | 75 

我需要什麼,是讓所有這些信息在一排,因爲我需要把它作爲另一個更大的查詢的一部分,即只返回一行。

我想到了group_concat,並有兩列,一個用於mod,一個用於adm。如果有多個mod(在給定的例子中是75,92),它們將被逗號分隔。

mod | adm 

Steven Smith, Jeremy Roy | Vincent Jones 

我清楚了嗎?謝謝朋友。

+1

組代替人的名字。 – 2011-02-28 13:00:15

+0

謝謝@ToonMariner,但即使如此,我得到了兩行。我想要一行。你怎麼看? – 2011-02-28 13:02:27

+0

如果這是一個更大的查詢的一部分,它可能會有所幫助,如果你詳細說明,因爲在這個階段可能更容易不分組這些數據。 – 2011-02-28 13:20:36

回答

0

一些谷歌搜索告訴我,我需要這個SQL:

SELECT 
GROUP_CONCAT(if(a.rank='mod', concat(m.prenom, ' ', m.nom), '')) AS 'mod', 
GROUP_CONCAT(if(a.rank='adm', concat(m.prenom, ' ', m.nom), '')) AS 'adm' 
FROM `0_area` AS a 
LEFT JOIN 0_member AS m ON a.user_id = m.id 
LEFT JOIN 0_depart AS d ON a.user_id = d.user_id 
WHERE a.sec_id =2 
AND (a.rank = 'mod' OR a.rank = 'adm') 
AND d.department IN (75, 92) 
GROUP BY a.sec_id 

@ToonMariner這解決了此查詢的問題,但是,我仍然需要放兩一起查詢。可能我會爲這個創建一個新帖子。

0

喜歡的東西:

SELECT 
    a.rank AS rank, 
    concat(m.prenom, ' ', m.nom) AS name, 
    GROUP_CONCAT(d.department ORDER BY d.department ASC SEPARATOR '|') 
FROM 
    `0_area` AS a 
LEFT JOIN 
    0_member AS m 
ON 
    a.user_id = m.id 
LEFT JOIN 
    0_depart AS d 
ON 
    a.user_id = d.user_id 
WHERE 
    a.sec_id = 2 
AND 
    (a.rank = 'mod' OR a.rank = 'adm') 
AND 
    d.department IN (75, 92) 
GROUP BY 
    a.rank 
+0

分隔符是默認的','而不是'|' ? – 2011-02-28 12:54:50

+0

謝謝@ToonMariner。我已經更新了我的問題,可能我之前並不清楚。 – 2011-02-28 12:54:53

+0

@Steve Claridge我不在乎分隔符,','或'|' – 2011-02-28 12:55:23