Where 子句使用带有 IF 和 IFNULL 的别名列

Where clause using alias column with IF and IFNULL

我有一个 mysql 查询如下:

SELECT 
        sppt_ticket.*, 
        IF(sppt_read_support_ticket.ID_aks_user IS NULL,'N', 'Y') AS `read_status`, 
        IFNULL(readcomment.total_comment, 0) AS unread_comment
    FROM 
        sppt_ticket
    LEFT JOIN 
        sppt_read_support_ticket ON 
        sppt_ticket.ID_support_ticket = sppt_read_support_ticket.ID_support_ticket AND 
        ID_aks_user = 1
    LEFT JOIN
        (SELECT 
            sppt_comment.ID_support_ticket, SUM(IF(sppt_read_comment.ID_aks_user IS NULL, 1, 0)) 
    AS 
        total_comment
    FROM 
        sppt_comment
    LEFT JOIN 
        sppt_read_comment 
    ON 
        sppt_comment.ID_comment = sppt_read_comment.ID_comment 
    AND 
        sppt_read_comment.ID_aks_user = 1
    GROUP BY 
        sppt_comment.ID_support_ticket) AS readcomment ON readcomment.ID_support_ticket = sppt_ticket.ID_support_ticket

我想在where子句中得到的是这样的

WHERE read_status = 'Y'

我试过使用子查询,但还是没明白.. 有帮助吗?

你试过这个吗:

SELECT * FROM
(
-- your original query as a table
SELECT 
    sppt_ticket.*, 
    IF(sppt_read_support_ticket.ID_aks_user IS NULL,'N', 'Y') AS `read_status`, 
    IFNULL(readcomment.total_comment, 0) AS unread_comment
FROM 
    sppt_ticket
LEFT JOIN 
    sppt_read_support_ticket ON 
    sppt_ticket.ID_support_ticket = sppt_read_support_ticket.ID_support_ticket AND 
    ID_aks_user = 1
LEFT JOIN
    (SELECT 
        sppt_comment.ID_support_ticket, SUM(IF(sppt_read_comment.ID_aks_user IS NULL, 1, 0)) 
AS 
    total_comment
FROM 
    sppt_comment
LEFT JOIN 
    sppt_read_comment 
ON 
    sppt_comment.ID_comment = sppt_read_comment.ID_comment 
AND 
    sppt_read_comment.ID_aks_user = 1
GROUP BY 
    sppt_comment.ID_support_ticket) AS readcomment ON readcomment.ID_support_ticket = sppt_ticket.ID_support_ticket
)
as temptable
where read_status = 'Y' -- this should work

或者,如果您不想将查询视为 table:

,则可以使用 HAVING 而不是 WHERE
SELECT 
    sppt_ticket.*, 
    IF(sppt_read_support_ticket.ID_aks_user IS NULL,'N', 'Y') AS `read_status`, 
    IFNULL(readcomment.total_comment, 0) AS unread_comment
FROM 
    sppt_ticket
LEFT JOIN 
    sppt_read_support_ticket ON 
    sppt_ticket.ID_support_ticket = sppt_read_support_ticket.ID_support_ticket AND 
    ID_aks_user = 1
LEFT JOIN
    (SELECT 
        sppt_comment.ID_support_ticket, SUM(IF(sppt_read_comment.ID_aks_user IS NULL, 1, 0)) 
AS 
    total_comment
FROM 
    sppt_comment
LEFT JOIN 
    sppt_read_comment 
ON 
    sppt_comment.ID_comment = sppt_read_comment.ID_comment 
AND 
    sppt_read_comment.ID_aks_user = 1
GROUP BY 
    sppt_comment.ID_support_ticket) AS readcomment ON readcomment.ID_support_ticket = sppt_ticket.ID_support_ticket
HAVING read_status = 'Y' -- use HAVING instead of WHERE

将原始查询视为 table 的原因在于查询中计算值的方式。在您的原始查询中,别名 read_status 不能与 WHERE 子句一起使用,因为在评估 WHERE 子句时可能还不知道实际值。如 Section B.1.5.4, “Problems with Column Aliases”. 中所述,将其视为 table 可确保已评估 read_status 的值。

对于 HAVING 方法,MySQL 创建了对标准 SQL 的扩展,即 permits references in the HAVING clause to aliased expressions in the select list