2013-01-12 73 views
2

MYSQL結構的多個不同的值:MYSQL GROUP BY與特定列

ID | USERID | FRIENDID | Type 
------------------------------- 
1 | 10 | 20 | Gold 
2 | 20 | 10 | Gold 

3 | 30 | 40 | Silver 
4 | 40 | 30 | Silver 

5 | 50 | 60 | Gold 
6 | 60 | 50 | Gold 

7 | 70 | 80 | Bronze 
8 | 80 | 70 | Bronze 

9 | 90 | 100 | Bronze 
10 | 100 | 90 | Bronze 

我想是GROUP(ID 1個& ID 2)和(ID 5 & ID 6),因爲它們是 「金」 的類型, NOT GROUP BY TYPE

返回結果:

1. 10 & 20, type:gold. (GROUP) 

3. 30 & 40, type:silver. 
4. 40 & 30, type:silver. 

5. 50 & 60, type:gold. (GROUP) 

7. 70 & 80, type:bronze. 
8. 80 & 70, type:bronze. 

9. 90 & 100, type:bronze. 
10. 100 & 90, type:bronze. 

如何做到這一點用PHP查詢?

演示:http://sqlfiddle.com/#!2/13bd3/1

+0

是事先知道組靜態的數字你想要的ID? – Sebas

+0

嗨Sebas,是的。 – richard

+0

如果你想type = Gold那麼爲什麼還有更多結果 –

回答

7

你需要做的是添加基於類型的其他分組條款。當它是'黃金'時,你會得到一個常數。否則,您使用以下ID:

select least(userid, friendid), greatest(userid, friendid), type 
from t 
group by least(userid, friendid), greatest(userid, friendid), 
     (case when type = 'gold' then 0 else id end) 

這會重新排列非金色類型的ID的順序。如果順序很重要,SQL是一個有點複雜:

select (case when type = 'gold' then least(userid, friendid) else userid end), 
     (case when type = 'gold' then greatest(userid, friendid) else friendid end), 
     type 
from t 
group by least(userid, friendid), greatest(userid, friendid), 
     (case when type = 'gold' then 0 else id end) 
+0

完美!謝謝戈登! :) – richard

2
SELECT GROUP_CONCAT(friend_id) , type FROM mytable GROUP BY type 

Demo

+0

雖然這可能不是這個具體情況的正確答案,但group_concat節省了我的時間。 –

0

試試這個:

SELECT id, userid, friendid, type 
FROM (SELECT id, userid, friendid, type, 
      IF(LOWER(type) = 'gold', IF(@lasttype=(@lasttype:=TYPE), @auto, @auto:[email protected]+1), @auto:[email protected]+1) indx 
     FROM tablename, (SELECT @auto:=1, @lasttype:=0) a 
     ORDER BY id) a 
GROUP BY indx;