选择条件出现多次sql的行

时间:2015-04-17 07:30:12

标签: mysql sql select count where

我对MySQL有一个看法,我想过滤掉那些temID对特定用户不止一次出现的行。

让我们说一下数据的样本是:


id  name    ques    temID

55  peter   1993    680
55  peter   1994    680
55  peter   1476    680
55  peter   1879    684
55  peter   1440    686
55  peter   1440    686
55  peter   1438    686
55  peter   1921    687
55  peter   1922    687
55  peter   1921    687
56  john    1853    684
56  john    1853    684
56  john    1539    687
56  john    1998    1512
56  john    2281    1534
56  john    2282    1534
56  john    2282    1534

我希望结果是


id  name    ques    temID

55  peter   1993    680
55  peter   1994    680
55  peter   1476    680
55  peter   1440    686
55  peter   1440    686
55  peter   1438    686
55  peter   1921    687
55  peter   1922    687
55  peter   1921    687
56  john    1853    684
56  john    1853    684
56  john    2281    1534
56  john    2282    1534
56  john    2282    1534

应删除这三行,因为temID仅对每个用户显示一次:


id  name    ques    temID

55  peter   1879    684
56  john    1539    687
56  john    1998    1512

我试过

select * from v_tem 
WHERE temID IN
    (     SELECT temID
          FROM v_tem 
          GROUP BY id, temID
          HAVING COUNT(*) > 1
    )
GROUP BY id, temID
ORDER BY id, temID;

但结果是


id  name    ques    temID

55  peter   1993    680
55  peter   1994    680
55  peter   1476    680
55  peter   1879    684
55  peter   1440    686
55  peter   1440    686
55  peter   1438    686
55  peter   1921    687
55  peter   1922    687
55  peter   1921    687
56  john    1853    684
56  john    1853    684
56  john    1539    687
56  john    2281    1534
56  john    2282    1534
56  john    2282    1534


id  name    ques    temID

56  john    1998    1512

已删除。

我的猜测是因为temID 684对john来说不止一次出现,所以它传递了where子句,即使它只出现一次对于peter。对于temID 687也是如此。即使它只出现在john一次,因为它对于peter来说是两次出现,所以where子句不会省略它。

请帮忙!

2 个答案:

答案 0 :(得分:2)

select o.*
from v_tem o join 
(select id,temID from v_tem group by id,temID having count(1)>1) t
on o.id=t.id and o.temID=t.temID

t表为您提供了多次出现的id-temID组。

因此,使用o加入原始表格t会为您提供所需的所有记录。

sql fiddle here [http://sqlfiddle.com/#!9/b69790/1]

答案 1 :(得分:0)

您需要使用join来获得正确的输出。您的内部查询仅返回temId,这对于不同的用户来说是重复的。

记录55-684未被删除,因为正在为用户56返回temId 684.与其他人相同。

您的表中似乎没有可以在内部查询中使用的主键,因此您需要在id和temId上使用连接条件。