1

我有什么特别的原因让 MySQL 在允许使用的date_sent_at同时WHERE不允许使用 inGROUP BY吗?

SELECT
    CONCAT(type, '_', IF(om.is_auto, 'auto', 'user')) AS subtype,
    DATE(om.sent_at) AS date_sent_at,
    COUNT(om.id) AS sends
FROM outgoing_message om INNER JOIN outgoing_message_customers AS omc
    ON om.id = omc.outgoing_message_id
WHERE
    omc.customer_id = 2
    AND
    om.status <> 'pending'
    AND
    date_sent_at >= '2012-01-01'
GROUP BY subtype, date_sent_at

编辑:我知道(当然)我可以用DATE(om.sent_at) >= '2012-01-01'.

4

6 回答 6

1

问题是您使用DATE(om.sent_at) as date_sent_at. 该AS部分在WHERE子句中不起作用,但在GROUP BY语句中起作用。

试试这个:

SELECT
CONCAT(type, '_', IF(om.is_auto, 'auto', 'user')) AS subtype,
DATE(om.sent_at) as date_sent_at,
COUNT(om.id) as sends
FROM outgoing_message om INNER JOIN outgoing_message_customers AS omc
ON om.id = omc.outgoing_message_id
WHERE
omc.customer_id = 2 and om.status <> 'pending'
AND
DATE(om.sent_at) > '2012-01-01'
GROUP BY subtype, date_sent_at
于 2012-07-19T10:48:56.097 回答
1

不能在 WHERE 子句中使用别名。应该使用完整的句子DATE(om.sent_at) >

于 2012-07-19T10:49:45.380 回答
1

您不能在 where 子句中使用列别名,但可以在 have 子句中使用它们。

在 where 子句中使用以下条件:

DATE(om.sent_at) > '2012-01-01'
于 2012-07-19T10:49:59.510 回答
1

您不能在 where 中使用别名,但可以在 GROUP BY 中使用

正如这里的mysql文档中所写:

A select_expr can be given an alias using AS alias_name. The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses. For example:

希望这有帮助。

于 2012-07-19T10:51:26.367 回答
0

date_sent_at 是别名 .. 你必须在 where 子句中给出 DATE(om.sent_at)

请查看 SELECT 语句中的操作顺序

于 2012-07-19T10:49:14.163 回答
0

您不能使用您在 WHERE 子句中的 SELECT 列表中指定的列别名。您可以使用用于构造列的表达式:

SELECT        CONCAT(type, '_', IF(om.is_auto, 'auto', 'user')) AS subtype,
              DATE(om.sent_at) as date_sent_at,
              COUNT(om.id) as sends
FROM          outgoing_message om 
INNER JOIN    outgoing_message_customers AS omc
ON            om.id = omc.outgoing_message_id
WHERE         omc.customer_id = 2
AND           om.status <> 'pending'
AND           DATE(om.sent_at) >= '2012-01-01'
GROUP BY      subtype, date_sent_at
于 2012-07-19T10:50:19.613 回答