2011-05-05 76 views
3

使用group by,having子句会让我知道给定的id是否有多条记录。无论如何要知道这两个记录在其他栏目中是如何不同的?查找列值的差异

mysql>select pid, name, city from table1; 
+------+-------------+--------+ 
| pid | name  | city | 
+------+-------------+--------+ 
| 1 | aa   | delhi | 
| 2 | bb   | delhi | 
| 3 | cc   | mumbai | 
| 4 | salman  | pune | 
| 4 | salman khan | pune | 
+------+-------------+--------+ 
5 rows in set (0.00 sec) 

mysql>select pid, count(*) as cnt from table1 group by pid having cnt > 1; 
+------+-----+ 
| pid | cnt | 
+------+-----+ 
| 4 | 2 | 
+------+-----+ 
1 row in set (0.00 sec) 

预期结果:

+------+-------------+ 
| pid | name  | 
+------+-------------+ 
| 4 | salman  | 
| 4 | salman khan | 
+------+-------------+ 
2 rows in set (0.00 sec) 

我可以用下面的查询实现这一目标...

mysql>select pid, name from table1 where pid=4; 

但我怎么会知道这两个行的名称和不同城市是一样的吗? 表中有一个时间戳列,我需要根据该时间排序这些行。给定PID的首次记录将是第一个。

+1

+1对于很好的格式化..... – NAVEED 2011-05-05 07:01:17

回答

1

为了让你发布预期的结果,请尝试:

select pid, name 
from table1 
where pid in 
    (select pid 
    from table1 
    group by pid 
    having count(*) > 1) 
group by pid, name 

如果您在

  • 城市和PID这样的情况特别感兴趣相同
  • 名称不同
  • 按组内的时间排序

正如你在你的问题中解释的那样,请尝试:

select pid, name, city, timestamp 
from table1 
where pid in 
    (select pid 
    from table1 
    group by pid, city 
    having count(*) > 1) 
group by pid, name, city 
order by pid, city, timestamp 
0

通过谷歌搜索,我发现从Kodyaz.com以下样本,可能会让你在正确的轨道上。