【问题标题】:MySQL SELECT FROM WHERE COUNTMySQL 从哪里选择
【发布时间】:2014-06-04 14:36:22
【问题描述】:

您好,我正在寻找一个 MySQL Select,它只返回在 xxx 列中包含双倍条目的行

示例:

+------+------+------------+--------------------+
| id   | name | work_date  | daily_typing_pages |
+------+------+------------+--------------------+
|    1 | John | 2007-01-24 |                250 |
|    2 | Ram  | 2007-05-27 |                220 |
|    3 | Jack | 2007-05-06 |                170 |
|    4 | Jack | 2007-04-06 |                100 |
|    5 | Jill | 2007-04-06 |                220 |
|    6 | Zara | 2007-06-06 |                300 |
|    7 | Zara | 2007-02-06 |                350 |
+------+------+------------+--------------------+

得到了这张表,我想读出所有名称不止一次列出的条目, 我的查询不起作用,因为它只显示两次名称的条目一次

SELECT id, name, COUNT(name) AS count
    FROM table_xy   
    having count(name) > 1;

我想要返回的东西:

+------+------+------------+
| id   | name |   count    | 
+------+------+------------+
|    3 | Jack |     2      |
|    4 | Jack |     2      |
|    6 | Zara |     2      |
|    7 | Zara |     2      |
+------+------+------------+

有没有办法得到它?

【问题讨论】:

  • 不,这不是我想要的结果,如果我按名称分组,它只会为每个不同的名称显示一个条目...

标签: php mysql sql count where


【解决方案1】:

您可以通过以下方式为您的组使用子查询:

SELECT  x.id, y.name, y.count
FROM    table_xy AS x
        INNER JOIN
        (   SELECT  Name, COUNT(*) AS count
            FROM     table_xy
            GROUP BY Name
            HAVING COUNT(*) > 1
        ) AS y
            ON y.Name = x.Name;

如果您不需要计数,您也可以使用带 distinct 的自联接:

SELECT  DISTINCT x.ID, x.Name
FROM    table_xy AS x
        INNER JOIN table_xy AS y
            ON x.Name = y.Name
            AND x.ID != y.ID;

如果您确实需要计数,也可以使用 GROUP BY 自加入:

SELECT  x.ID, x.Name, COUNT(y.ID) + 1 AS count
FROM    table_xy AS x
        INNER JOIN table_xy AS y
            ON x.Name = y.Name
            AND x.ID != y.ID
GROUP BY x.ID, x.Name;

Examples on SQL Fiddle

【讨论】:

  • 首选USING (Name) 而不是ON y.Name = x.Name - 我不确定它是否适用于派生表,但这是一个很好的做法,因为它不仅可以减少歧义(“错误:X 列是模棱两可”或类似的),但它也倾向于更好地利用索引。
  • 此外,由于您使用的是HAVING,因此您可以使用count 别名而不是COUNT(*) 函数——可以肯定的是,MySQL 会优化它,但仍然不会受到伤害。
  • 是的,效果很好,谢谢你,感谢 Niet the Dark Absol 提供的 USING(Name) 信息,我也不知道 ;)
  • @NiettheDarkAbsol 你有什么可以证明USINGbetter use of indexes 的事实吗?在this case at least 中,执行计划是相同的。关于您的其他观点,我认为它们完全是主观的,我个人不喜欢 using 子句的不灵活(即您只能使用等于运算符),这导致 USING 和显式谓词在整个查询,我非常喜欢一致性。
  • @GarethD 恐怕我没有任何证据可以证明这一点,抱歉!我刚刚注意到通过在使用USING 和不使用它之间进行更改来获得更好的性能。然而,USING 明确告诉 MySQL 列是相等的,因此例如SELECT a FROM x JOIN y USING (a) 有效,而SELECT a FROM x JOIN y ON x.a=y.a 导致a 在字段列表中不明确(并且SELECT x.a 不会传达相同的感觉,当阅读查询)
【解决方案2】:

试试这个...

SELECT  x.ID, x.Name, COUNT(y.ID) + 1 AS count

FROM table_xy AS x

INNER JOIN table_xy AS y

开启 x.Name = y.Name

AND x.ID != y.ID 按 x.ID、x.Name 分组;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-05
    • 2021-09-03
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多