【问题标题】:Ignore Field used in HAVING clause on SELECT忽略 SELECT 的 HAVING 子句中使用的字段
【发布时间】:2013-10-26 09:13:48
【问题描述】:

我有以下问题。

SELECT parent.id AS 'id', parent.CA_NAME as 'name', node.level AS 'level', midpoint.level AS 'midpointlevel', SUM(ad.id IS NOT NULL) AS 'count'
FROM
category AS parent,
category AS midpoint,
category AS node
LEFT JOIN ad ON ad.id=node.id
AND ad.status='A'
WHERE (node.`LEFT` BETWEEN parent.`LEFT` AND parent.`RIGHT`)
AND (node.`LEFT` BETWEEN midpoint.`LEFT` AND midpoint.`RIGHT`)
AND midpoint.id='1'
GROUP BY parent.id
HAVING IF(midpoint.level=0, node.level < 2, node.level > 0)
ORDER BY parent.id

我不想选择midpoint.level AS 'midpointlevel' 部分,但如果我删除它,having 子句会给出错误提示:错误代码:1054。'having 子句'中的未知列'midpoint.level'。谁能帮我删除不需要的选择部分。

【问题讨论】:

  • 这是一个非常好的问题,我期待着阅读适当的答案。
  • 每个组中有多个可能的midpoint.level 值。你想用哪个?

标签: mysql sql having-clause


【解决方案1】:

最简单的方法是使用简单的子查询:

SELECT id, 
       name,
       -- midpointlevel,  <-- commented out, since we don't need this column 
       level, 
       count
FROM (
  SELECT parent.id AS 'id', parent.CA_NAME as 'name', node.level AS 'level',  midpoint.level AS 'midpointlevel', SUM(ad.id IS NOT NULL) AS 'count'
  FROM
  category AS parent,
  category AS midpoint,
  category AS node
  LEFT JOIN ad ON ad.id=node.id
  AND ad.status='A'
  WHERE (node.`LEFT` BETWEEN parent.`LEFT` AND parent.`RIGHT`)
  AND (node.`LEFT` BETWEEN midpoint.`LEFT` AND midpoint.`RIGHT`)
  AND midpoint.id='1'
  GROUP BY parent.id
  HAVING IF(midpoint.level=0, node.level < 2, node.level > 0)
  ORDER BY parent.id
) subquery

【讨论】:

  • 谢谢,这行得通。但是你认为子查询会影响性能吗?
  • 不,在这种情况下(直接 SELECT 表单子查询,没有额外的 WHERE 子句),运行时间将与原始查询完全相同。
【解决方案2】:

选择列名,聚合函数(列名) FROM 表名 WHERE column_name 运算符值 按列名分组 HAVING aggregate_function(column_name) 运算符值;

参考上面的语法

【讨论】:

    【解决方案3】:

    如果将其添加到 GROUP BY,则可以将其从选择中删除。不熟悉 HAVING IF。试试这个:

    GROUP BY parent.id,midpoint.level
    HAVING (midpoint.level=0 AND node.level < 2 AND node.level > 0)
    ORDER BY parent.id
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-11
      • 2017-12-22
      • 2017-09-30
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 2016-03-27
      • 1970-01-01
      相关资源
      最近更新 更多