【问题标题】:MySQL query for opposite of GROUP BY or DISTINCT?MySQL查询与GROUP BY或DISTINCT相反?
【发布时间】:2019-04-20 05:19:15
【问题描述】:

下面的答案对我来说很好用:

现在我不想选择 distinct 或 group by ,而是选择所有 ext_no 的记录,只有 value

如何修改这个答案?我尝试使用 order by,但它显示错误。任何帮助将不胜感激。提前致谢。

SELECT   ext_no, MAX(value)
FROM     test
GROUP BY ext_no
HAVING   COUNT(*) > 2 AND 
         COUNT(*) = COUNT(CASE value WHEN 0 THEN 1 END)

【问题讨论】:

    标签: mysql select group-by distinct


    【解决方案1】:

    有几种方法可以实现这一目标。在WHERE 子句中使用几个相关的子查询,或者通过加入到包含MAX(value)COUNT(*) 值的表中,每个ext_no 值:

    查询 1

    SELECT ext_no
    FROM test t1
    WHERE NOT EXISTS (SELECT * 
                      FROM test t2
                      WHERE t2.ext_no = t1.ext_no AND value != 0)
      AND (SELECT COUNT(*)
           FROM test t3
           WHERE t3.ext_no = t1.ext_no) > 2
    

    第一个子查询检查这个ext_no 没有value 除了0。第二个检查这个ext_no 有两个以上的副本。

    查询 2

    在此查询中,我们在JOIN 条件中应用所有条件(value 没有非零值和ext_no 的两个以上副本)。

    SELECT t1.ext_no
    FROM test t1
    JOIN (SELECT ext_no, MAX(value) AS max_value, COUNT(*) AS count
          FROM test 
          GROUP BY ext_no) t2
      ON t2.ext_no = t1.ext_no AND t2.max_value = 0 AND t2.count > 2
    

    输出(对于两个查询)

    ext_no
    12133
    12133
    12133
    11505
    11505
    11505
    11505
    

    Demo on SQLFiddle

    【讨论】:

    • no.. 它选择所有为零的值.. 条件是..如果 ext_no 的计数大于 2.. 并且当且仅当所有 ext_no 都为零时选择...只有..请看link
    • @user10146017 查看我的编辑。希望这次能正确理解您的问题。
    • 是的,我正在试一试..实际数据库有超过 20 万条记录,所以它可能需要一些时间..
    • @user10146017 您可能会发现查询的第二个版本要快得多,因为在第一个查询中,必须为表的每一行运行相关子查询
    • @user10146017 如果您只想删除,可以使用上一个问题的答案DELETE FROM test WHERE ext_no IN (...)
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 2011-01-29
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多