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 上找到的其他一些答案,我无法真正弄清楚为什么第一个有效:
- Using column alias in WHERE clause of MySQL query produces an error
- Why can't I use alias in a count(*) "column" and reference it in a having clause?
根据这些答案,我应该在 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 子句中使用别名(您不能。)如果您认为这会给你一个有意义的结果,但是你完全错了。
我正在为两个看似简单的查询而苦苦挣扎。
查询 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 上找到的其他一些答案,我无法真正弄清楚为什么第一个有效:
- Using column alias in WHERE clause of MySQL query produces an error
- Why can't I use alias in a count(*) "column" and reference it in a having clause?
根据这些答案,我应该在 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 子句中使用别名(您不能。)如果您认为这会给你一个有意义的结果,但是你完全错了。