【问题标题】:MySQL "not in" with COUNT() not working correctlyMySQL“不在”与 COUNT() 无法正常工作
【发布时间】:2021-09-16 21:35:27
【问题描述】:

我想运行一个简单的查询来抛出表 'tmp' 的所有行,这些行在 'post_removed' 列中没有 "yes"

我尝试使用:

SELECT COUNT(post_id NOT IN (SELECT DISTINCT post_id FROM tmp WHERE post_removed = 'yes')) AS total FROM tmp

这反而会引发语法错误。谷歌搜索把我带到了人们说 MySQL 不支持 NOT IN 并且需要使用极其复杂的东西的论坛。我可以计算每一行,在post_removed 列中没有'yes' 吗?

对于列本身,它有两种状态,not_set(默认)和yes(表示已删除,因此不计算查询)

【问题讨论】:

  • 这样的问题首先应该对您的数据模型/表结构进行适当的解释。为什么这里有一个子查询?为什么需要 DISTINCT?
  • MySQL support NOT IN 但是你使用它的方式不是根据 MySQL accept 作为有效用法。

标签: php mysql


【解决方案1】:

您可以尝试多种选择

SELECT COUNT(POST_ID)
FROM TMP
WHERE POST_ID NOT IN (SELECT DISTINCT post_id FROM tmp WHERE post_removed = 'yes')

SELECT COUNT(DISTINCT(post_id))
FROM tmp
WHERE post_removed != 'yes'

【讨论】:

    【解决方案2】:

    我会尝试这种方式。

    SELECT COUNT(post_id) AS total 
    FROM tmp WHERE post_id NOT IN 
    (SELECT DISTINCT post_id FROM tmp WHERE post_removed = 'yes')) 
    

    虽然如果表很大,那么 NOT IN 会表现不佳

    【讨论】:

      【解决方案3】:

      MySQL 支持NOT IN 子句,如其documentation 中所述。

      您的查询语法不正确。根据您的要求,

      我是否能够计算 post_removed 列中没有“是”的每一行?

      尝试使用此查询:

      SELECT COUNT(*)
      FROM tmp
      WHERE post_removed != 'yes'
      

      如果post_id有重复值,则可以申请DISTINCT获取唯一值

      SELECT COUNT(DISTINCT(post_id))
      FROM tmp
      WHERE post_removed != 'yes'
      

      或者执行GROUP BY会得到相同的结果,即使你可以为每个post_id得到post_removed

      SELECT post_id, COUNT(*)
      FROM tmp
      WHERE post_removed != 'yes'
      GROUP BY post_id
      

      如果tmp 表有很多行,最好将INDEX 放在post_removed 列上。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-05
        • 1970-01-01
        • 2019-05-16
        • 2017-09-04
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 2022-06-15
        相关资源
        最近更新 更多