2017-03-22 151 views
1

想,我有这样的一个表:GROUP BY在MySQL查询

+---------+------------------+ 
| post_id | original_post_id | 
+---------+------------------+ 
| 1  | 0    | 
| 2  | 0    | 
| 3  | 0    | 
| 4  | 2    | 
| 5  | 2    | 
| 6  | 0    | 
| 7  | 1    | 
| 8  | 1    | 
| 9  | 1    | 
| 10  | 0    | 
| 11  | 0    | 
| 12  | 3    | 
+---------+------------------+ 

简单地说,在这个表我包含用户的帖子,我想展示一些东西像一个时间表。所有的记录,其中original_post_id=0 - 是原始帖子,无论如何都必须显示。但所有的记录original_post_id!=0 - 都是转贴的,所以我只想给他们看一次。所以,作为一个结果,我需要的是这样的:

+---------+------------------+ 
| post_id | original_post_id | 
+---------+------------------+ 
| 1  | 0    | 
| 2  | 0    | 
| 3  | 0    | 
| 4  | 2    | 
| 6  | 0    | 
| 7  | 1    | 
| 10  | 0    | 
| 11  | 0    | 
| 12  | 3    | 
+---------+------------------+ 

据我了解,我必须使用GROUP BY,但究竟如何?

回答

3

您可以使用单个group by做到这一点,但它是棘手:

select min(post_id) as post_id, min(original_post_id) 
from t 
group by original_post_id, 
     (case when original_post_id = 0 then post_id end); 
+0

真棒!就是这样! –

0

你可以试试这个:

SELECT * FROM tableName 
Where original_post_id = 0 
Union 
SELECT * FROM tableName 
Where original_post_id != 0 
Group by original_post_id