代码之家  ›  专栏  ›  技术社区  ›  gremo

为什么我不能在WHERE中使用我的列,而我可以在GROUP BY中使用?

  •  1
  • gremo  · 技术社区  · 13 年前

    MySQL不允许使用 date_sent_at 在里面 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_sent_at >= '2012-01-01'
    GROUP BY subtype, date_sent_at
    

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

    6 回复  |  直到 13 年前
        1
  •  1
  •   metalfight - user868766    13 年前

    不能在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:
    

    希望得到帮助。

        2
  •  1
  •   Horen    13 年前

    问题是你使用 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
    
        3
  •  1
  •   Yaroslav    13 年前

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

        4
  •  1
  •   Omesh    13 年前

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

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

    DATE(om.sent_at) > '2012-01-01'
    
        5
  •  0
  •   Maximilian Mayerl    13 年前

    不能在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
    
        6
  •  0
  •   Joe G Joseph    13 年前

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

    让我们看看 the order of operations in a SELECT statement