【问题标题】:select rows where criteria appears more than once sql选择条件出现多次sql的行
【发布时间】:2015-06-23 22:26:21
【问题描述】:

我有一个关于 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 子句省略。

请帮忙!

【问题讨论】:

  • 我知道 MySQL 以自己的方式处理事情,但一般的 GROUP BY 规则是:“如果指定了 GROUP BY 子句,则 SELECT 列表中的每个列引用必须标识一个分组列或者是集合函数的参数。”

标签: mysql sql select count where


【解决方案1】:
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 组。

因此,将原始表 ot 连接起来即可获得所需的所有记录。

这里的 sql 小提琴 [http://sqlfiddle.com/#!9/b69790/1]

【讨论】:

  • @AmeyaDeshpande 在我的回答中添加了。谢谢
  • 感谢@amow 和@Ameya!我可以知道 count(1) 是什么意思吗?
  • @jasonC count(1) 和 count(*) 一样,早期的 mysql 版本不会自动优化。只是个人习惯。
【解决方案2】:

您需要使用 join 才能正确输出。您的内部查询仅返回对不同用户重复的 temId。

记录 55-684 没有被删除,因为正在为用户 56 返回 temId 684。其他人也一样。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多