select 条条件多次出现的行 sql
select rows where criteria appears more than once sql
我对 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 子句省略。
请帮忙!
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
table 给你所有出现不止一次的 id-temID
组。
所以加入原来的tableo
和t
给你所有你需要的记录。
sql fiddle 这里 [http://sqlfiddle.com/#!9/b69790/1]
您需要使用 join 才能获得正确的输出。您的内部查询 return 只有 temId,它对不同的用户是重复的。
记录 55-684 未被删除,因为 temId 684 正在为用户 56 return编辑。其他人也是如此。
您的 table 中似乎没有可以在您的内部查询中使用的主键,因此您需要对 id 和 temId 使用连接条件。
我对 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 子句省略。
请帮忙!
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
table 给你所有出现不止一次的 id-temID
组。
所以加入原来的tableo
和t
给你所有你需要的记录。
sql fiddle 这里 [http://sqlfiddle.com/#!9/b69790/1]
您需要使用 join 才能获得正确的输出。您的内部查询 return 只有 temId,它对不同的用户是重复的。
记录 55-684 未被删除,因为 temId 684 正在为用户 56 return编辑。其他人也是如此。
您的 table 中似乎没有可以在您的内部查询中使用的主键,因此您需要对 id 和 temId 使用连接条件。