SQL查询错误:Where子句中的'不知道列名'

时间:2011-08-02 08:16:36

标签: mysql sql

任何人都可以帮助我,我有点卡住了。

我有一个像魅力一样的查询

SELECT * , 
       matches - falsepositives AS hits
FROM (
    SELECT c. * , 
           IFNULL( p.total, 0 ) AS matches, 
            (
                SELECT COUNT( * ) 
                FROM ci_falsepositives n
                WHERE n.addressbook_id = c.reference
                AND n.sanction_key
                IN (
                    SELECT sanction_key
                    FROM ci_matched_sanctions
                )
            ) AS falsepositives
    FROM ci_address_book c
    LEFT JOIN (
        SELECT addressbook_id, 
               COUNT( match_id ) AS total
        FROM ci_matched_sanctions
        GROUP BY addressbook_id
    ) AS p 
        ON c.id = p.addressbook_id
) AS S
WHERE matches > 0
ORDER BY hits DESC

但是我想把它更改为HITS大于0的排序,但它告诉我它不知道命中......是不是因为它是2项的计算?

1 个答案:

答案 0 :(得分:3)

您不能在WHERE子句中使用别名列。你需要重写它:

SELECT * , 
       matches - falsepositives AS hits
FROM (
    SELECT c. * , 
           IFNULL( p.total, 0 ) AS matches, 
            (
                SELECT COUNT( * ) 
                FROM ci_falsepositives n
                WHERE n.addressbook_id = c.reference
                AND n.sanction_key
                IN (
                    SELECT sanction_key
                    FROM ci_matched_sanctions
                )
            ) AS falsepositives
    FROM ci_address_book c
    LEFT JOIN (
        SELECT addressbook_id, 
               COUNT( match_id ) AS total
        FROM ci_matched_sanctions
        GROUP BY addressbook_id
    ) AS p 
        ON c.id = p.addressbook_id
) AS S
WHERE matches - falsepositives > 0
ORDER BY hits DESC

或者使用子查询:

SELECT * FROM (
    SELECT * , 
           matches - falsepositives AS hits
    FROM (
        SELECT c. * , 
               IFNULL( p.total, 0 ) AS matches, 
                (
                    SELECT COUNT( * ) 
                    FROM ci_falsepositives n
                    WHERE n.addressbook_id = c.reference
                    AND n.sanction_key
                    IN (
                        SELECT sanction_key
                        FROM ci_matched_sanctions
                    )
                ) AS falsepositives
        FROM ci_address_book c
        LEFT JOIN (
            SELECT addressbook_id, 
                   COUNT( match_id ) AS total
            FROM ci_matched_sanctions
            GROUP BY addressbook_id
        ) AS p 
            ON c.id = p.addressbook_id
    ) AS S
) AS S2
WHERE hits > 0
ORDER BY hits DESC
相关问题