【问题标题】:Use count value in clause WHERE在 WHERE 子句中使用计数值
【发布时间】:2021-03-28 01:38:57
【问题描述】:

我想在我的 SQL 查询中添加一个 WHERE 子句。但如果我添加 AND n! = 1,我得到一个错误。

我该怎么做?

谢谢

SELECT
    COUNT(1) AS n,
    `prescription`.`id_prescription`
FROM
    `intervention`
LEFT JOIN
    `prescription`
ON
    `prescription`.`id_prescription` = `intervention`.`id_prescription`
WHERE
    `intervention`.`status` != "finish" AND `intervention`.`status` != "canceled" 
GROUP BY
    id_prescription  
ORDER BY `n`  DESC

错误

请求 SQL:文档

SELECT
    COUNT(1) AS n,
    `prescription`.`id_prescription`
FROM
    `intervention`
LEFT JOIN
    `prescription`
ON
    `prescription`.`id_prescription` = `intervention`.`id_prescription`
WHERE
    `intervention`.`status` != "finish" AND `intervention`.`status` != "canceled"  AND `n` !=1
GROUP BY
    id_prescription  
ORDER BY `n`  
DESC LIMIT 0, 25

MySQL 回复:文档 #1054 - Champ 'n' inconnu dans where 子句

【问题讨论】:

  • 样本数据、期望的结果以及对您想要完成的内容的说明会有所帮助。除了where 子句之外,您的查询还有其他错误/不一致。

标签: mysql sql count having-clause


【解决方案1】:

您按LEFT JOIN 中的second 表进行聚合似乎很奇怪。如果您想计算每个处方的干预次数,那么您的查询应该如下所示:

SELECT p.id_prescription, COUNT(i.id_prescription) as num_interventions
FROM prescription p
     intervention i
     ON p.id_prescription = i.id_prescription AND
        i.stqatus NOT IN ('finish', 'canceled')
GROUP BY p.id_prescription  
HAVING COUNT(i.id_prescription) <> 1
ORDER BY COUNT(i.id_prescription) DESC;

此版本的查询在没有干预时正确返回 0 计数。我怀疑你真正想要的HAVING 子句是:

HAVING COUNT(i.id_prescription) > 1

如果这个解释是正确的,那么INNER JOIN 是比LEFT JOIN 更好的选择,因为逻辑需要匹配。

【讨论】:

    【解决方案2】:

    使用having 过滤聚合:

    SELECT COUNT(*) AS n, id_prescription
    FROM intervention i
    LEFT JOIN prescription p USING(`id_prescription`)
    WHERE i.status <> 'finish' AND i.status <> 'canceled'
    GROUP BY id_prescription  
    HAVING COUNT(*) <> 1
    ORDER BY n  DESC
    

    旁注:

    • 表别名使查询更易于编写和阅读

    • USING() 在匹配列是同音异义词时可以方便地缩短连接语法

    • 这里可能不需要反引号

    • &lt;&gt; 是不等式的标准运算符

    • 单引号是文字字符串的标准引用字符

    • MySQL 扩展了 SQL 标准并允许在 HAVING 子句中使用列别名,因此您也可以将其表述为:HAVING n &lt;&gt; 1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-14
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多