2015-09-27 26 views
2

如果我有如下一些記錄表格:試圖重新調整MySQL查詢 - 任何人有一些想法?

id reference_id message 
-- --------- ------- 
1 42   Foo 
2 42   Bar 
3 42   Two 

我可以用一個簡單的MySQL查詢到所有具有相同REFERENCE_ID行結合?我想收集所有具有相同REFERENCE_ID值的行的同一行/列,實現類似:

message1 message2 message3 
-------- -------- -------- 
Foo  Bar  Two 

從相關計算器後下面的代碼似乎是一個可行的解決方案,但它適用於組合僅兩行。

SELECT a.message AS message1, 
      b.message AS message2 
     FROM messages a 
INNER JOIN messages b ON a.parent_id=b.parent_id 
    WHERE a.id<b.id; 

我試圖重新調整上述查詢來組合三行或更多行,但迄今爲止我還沒有成功。 有誰知道一個MySQL查詢做我想要的,或者,如何重新調整上面的代碼來做我以後的事情?我應該溝通MySQL來解決這個問題嗎?

+0

這也被稱爲'PIVOT'操作。如果結果中有動態數量的列,則需要動態查詢;因爲SQL查詢的輸出'形狀'必須是固定的。在很多情況下,可以避免這種樞軸操作(可以將其看作非規範化的一種形式),特別是在與其他數據連接或通過代碼使用查詢時。 – user2864740

+0

當不是所有參考ID都具有相同數量的消息時,您期望的行爲是什麼? –

回答

0

您可以修改上述辦法是這樣的:

SELECT 
    a.message AS message1, 
    b.message AS message2, 
    c.message AS message3 
FROM messages a 
    INNER JOIN messages b ON a.reference_id = b.reference_id 
    INNER JOIN messages c ON b.reference_id = c.reference_id 
WHERE a.id < b.id AND b.id < c.id; 

這裏是SQL FIDDLE

0

對於動態數量的結果。使用GROUP_CONCAT按照reference_id將結果連接到一行中的單個列中,然後使用PHP中的爆炸將它們分開。

SELECT `reference_id`, GROUP_CONCAT(`message` SEPARATOR ',') AS `messages` 
FROM `messages` GROUP BY `reference_id`; 

將輸出

reference_id messages 
--------  -------- 
42   Foo,Bar,Two 

然後在你的PHP中使用,其結果

explode(',' $result['messages']); 

爆炸爲了讓每一行的消息。如果消息包含逗號,則在查詢中使用更明確的分隔符並且可能是多個字符。

+0

您建議的解決方案使用GROUP_CONCAT,然後PHP爆炸似乎是可行的解決方案。 只有使用mysql才能達到預期的效果,這證明很困難/不可能。 –

相關問題