2013-01-12 74 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;