我对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子句不会省略它。
请帮忙!
答案 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上使用连接条件。