Mysql: 算作 where 或 having 的别名

Mysql: count as alias with where or having

我正在为两个看似简单的查询而苦苦挣扎。

查询 n1(作品):

SELECT
  cliente.*,
  COUNT(*)                                           AS 'num_installazioni',
  CONCAT(provincia.nome, ' (', provincia.sigla, ')') AS 'provincia'
FROM q_cliente AS cliente
  JOIN dettaglio_installazione AS dettinst ON cliente.id = dettinst.cliente
  JOIN q_sede AS sede ON sede.id_cliente = cliente.id
  JOIN quadra_provincia_table AS provincia ON provincia.id = sede.id_provincia
WHERE 1 = 1 AND 'num_installazioni' < 5
GROUP BY cliente.id;

查询 n2(不起作用):

SELECT
  cliente.*,
  CONCAT(provincia.nome, ' (', provincia.sigla, ')') AS 'provincia',
  COUNT(*)                                       AS 'num_pulizie'
FROM q_cliente AS cliente
  JOIN q_sede AS sede ON sede.id_cliente = cliente.id
  JOIN quadra_provincia_table AS provincia ON provincia.id = sede.id_provincia
  JOIN quadra_attivita AS att ON cliente.id = att.id_cliente
WHERE 1 = 1 AND 'num_pulizie' >= 5 AND 'num_pulizie' <= 10
GROUP BY cliente.id;

查询 n2(工作版本):

SELECT
  cliente.*,
  COUNT(*)                                           AS `pulizie`,
  CONCAT(provincia.nome, ' (', provincia.sigla, ')') AS 'provincia'
FROM q_cliente AS cliente
  JOIN q_sede AS sede ON sede.id_cliente = cliente.id
  JOIN quadra_provincia_table AS provincia ON provincia.id = sede.id_provincia
  JOIN quadra_attivita AS att ON cliente.id = att.id_cliente
GROUP BY cliente.id
HAVING `pulizie` >= 5 AND `pulizie` <= 10;

上下文:

根据我在 Whosebug 上找到的其他一些答案,我无法真正弄清楚为什么第一个有效:

根据这些答案,我应该在 HAVING 子句中使用 COUNT(*) 别名,事实上它有效(参见第三个查询)但有趣的是查询 n1 非常相似但它有效。 我确定它改变的是我正在计算的连接 table 的行数(一个超过 4k 行(查询 n2),另一个少于 100 行(查询 n1))。

除了该查询 n2(工作版本)使用 ` 而查询 n1(工作版本)使用 '。我很困惑...

谁能解释一下我在做什么(或想)错了什么?

WHERE 1 = 1 AND 'num_installazioni' < 5

没有在这里使用别名 - 您正在检查 文本文字 num_installazioni 是否“小于” 5.

https://dev.mysql.com/doc/refman/5.7/en/identifiers.html

它“有效”,因为它不会引发错误,因为您没有在此处的 WHERE 子句中使用别名(您不能。)如果您认为这会给你一个有意义的结果,但是你完全错了。