为什么MySQL告诉我该列不存在?

为什么MySQL告诉我该列不存在?,mysql,subquery,Mysql,Subquery,我有三张桌子: associationid,名称 总状花序 statsid、日期、关联ID、类型ID、数量 我的目标是得到所有关联的列表,对于所有关联,类型的列表,数量,排序方式,首先是关联的总数,然后是每种类型。 对此,我有以下疑问: SELECT association.name AS associationName, race.name AS raceName, SUM(report.quantity) AS quantity, subreq

我有三张桌子: associationid,名称 总状花序 statsid、日期、关联ID、类型ID、数量

我的目标是得到所有关联的列表,对于所有关联,类型的列表,数量,排序方式,首先是关联的总数,然后是每种类型。 对此,我有以下疑问:

SELECT association.name AS associationName,
        race.name AS raceName,
        SUM(report.quantity) AS quantity,
        subrequest.totalquantity as totalquantity
    FROM stats report
    JOIN association ON association.id = report.associationId
    JOIN race ON race.id = report.raceId
    JOIN (
        SELECT SUM(report.quantity) AS totalquantity,
            association.id AS subId
        FROM stats report
        JOIN association ON association.id = report.associationId
        WHERE date LIKE "2013-11-%"
        GROUP BY association.id
        ORDER BY totalquantity DESC
    ) subrequest ON subrequest.subId = association.id
    WHERE date LIKE "2013-11-%"
    GROUP BY association.id, race.id
        ORDER BY totalquantity DESC, quantity DESC
它工作得非常好!但是现在,我只想为每个协会提供两种最大的类型。我试过这个:

set @num := 0, @association := '';
select associationName, raceName, quantity, totalquantity,
@num := if(@association = associationName, @num + 1, 1) as row_number,
        @association := associationName as dummy
FROM (
    SELECT association.name AS associationName,
        race.name AS raceName,
        SUM(report.quantity) AS quantity,
        subrequest.totalquantity as totalquantity
    FROM stats report
    JOIN association ON association.id = report.associationId
    JOIN race ON race.id = report.raceId
    JOIN (
        SELECT SUM(report.quantity) AS totalquantity,
            association.id AS subId
        FROM stats report
        JOIN association ON association.id = report.associationId
        WHERE date LIKE "2013-11-%"
        GROUP BY association.id
        ORDER BY totalquantity DESC
    ) subrequest ON subrequest.subId = association.id
    WHERE date LIKE "2013-11-%"
    GROUP BY association.id, race.id
    ORDER BY totalquantity DESC, quantity DESC
) x
WHERE row_number <= 2
这样,我就有了一个错误:1054-where子句中的未知列“row_number”。如果我删除where子句,它工作正常,并且得到了预期的结果。我还有一个列行号和正确的数字

我必须这样做才能让它工作:

set @num := 0, @association := '';
select associationName, raceName, quantity, totalquantity
FROM (
    select associationName, raceName, quantity, totalquantity,
    @num := if(@association = associationName, @num + 1, 1) as row_number,
            @association := associationName as dummy
    FROM (
        SELECT association.name AS associationName,
            race.name AS raceName,
            SUM(report.quantity) AS quantity,
            subrequest.totalquantity as totalquantity
        FROM association_race_report report
        JOIN association ON association.id = report.associationId
        JOIN race ON race.id = report.raceId
        JOIN (
            SELECT SUM(report.quantity) AS totalquantity,
                association.id AS subId
            FROM association_race_report report
            JOIN association ON association.id = report.associationId
            WHERE date LIKE "2013-11-%"
            GROUP BY association.id
            ORDER BY totalquantity DESC
        ) subrequest ON subrequest.subId = association.id
        WHERE date LIKE "2013-11-%"
        GROUP BY association.id, race.id
        ORDER BY totalquantity DESC, quantity DESC
    ) x
)y
WHERE row_number <= 2
这个很好用!但是我不明白为什么我需要添加另一个级别的请求以使WHERE子句起作用?添加一个无用的查询级别真让我恼火。有没有办法让它发挥作用?为什么MySQL会出现这个错误


谢谢大家!

MySQL不喜欢列引用,因为它是在查询的select部分中定义的——它还不能在JOIN和where子句中使用


解决方案是用定义别名的表达式替换别名,或者创建一个中间子查询,以避免重写整个过程,我认为这两种方法都是可以找到的。查询优化器将正常删除中间查询。

我终于找到了解决方案!我只需要替换其中的行号