2016-01-21 119 views
1

我想加入3表一列总和已经与另一列未知列在WHERE子句与加入

这里进行比较是我的查询

SELECT 
    *, `e`.`id` AS `event_ac_id`, 
    SUM(CASE WHEN trans.gift_transaction_status = 1 
       THEN trans.event_gift_amount 
       ELSE 0 END) as amount 
FROM 
    `tbl_event_category` `cat` 
LEFT JOIN 
    `tbl_event` `e` ON e.event_category = cat.id 
LEFT JOIN 
    `tbl_organisation` `org` ON e.organisation_id = org.id 
LEFT JOIN 
    `tbl_event_gift_transaction` `trans` ON e.id = trans.event_id 
WHERE 
    cat.type ='campaign' AND is_approved=1 
    AND e.funding_goal_amount <= amount 
GROUP BY 
    `event_ac_id` 
LIMIT 8 

异常(数据库除外)“警予\分贝\异常 '与消息 ' SQLSTATE [42S22]:柱未发现:在 1054未知列 '量' 'where子句'

回答

1

您需要了解SQL是从右向左评估的。因此,当MYSQL解析器查找amount列时,它不会被找到并因此出现错误。

manual说:

“A select_expr可以给出使用AS ALIAS_NAME一个别名的别名是用作表达式的列名 ,并且可以在GROUP BY使用, ORDER BY,或HAVING。条款“。

标准SQL不允许你引用列别名在WHERE子句 。施加此限制是因为当执行WHERE代码 时,列值可能尚未确定。

你可以试试这个:

SELECT *, `e`.`id` AS `event_ac_id`, 
    SUM(CASE WHEN trans.gift_transaction_status = 1 THEN trans.event_gift_amount 
    ELSE 0 END) as amount 
FROM `tbl_event_category` `cat` LEFT JOIN `tbl_event` `e` 
     ON e.event_category=cat.id 
LEFT JOIN `tbl_organisation` `org` ON e.organisation_id=org.id 
LEFT JOIN `tbl_event_gift_transaction` `trans` ON e.id=trans.event_id 
WHERE cat.type ='campaign' 
AND is_approved=1 
HAVING e.funding_goal_amount <= amount 
GROUP BY `event_ac_id` LIMIT 8 
+0

我已经试过'SUM(CASE WHEN trans.gift_transaction_status = 1,则trans.event_gift_amount ELSE 0 END)>电子.funding_goal_amount'还有什么解决方案 –

+0

@KakulSarma: - 尝试使用HAVING子句而不是WHERE子句来使用您的条件。 –

1

过滤器上的总价值为基础在具有

可能是你需要这个

SELECT *, `e`.`id` AS `event_ac_id`, 
    SUM(CASE WHEN trans.gift_transaction_status = 1 THEN trans.event_gift_amount 
    ELSE 0 END) as amount 
FROM `tbl_event_category` `cat` LEFT JOIN `tbl_event` `e` 
     ON e.event_category=cat.id 
LEFT JOIN `tbl_organisation` `org` ON e.organisation_id=org.id 
LEFT JOIN `tbl_event_gift_transaction` `trans` ON e.id=trans.event_id 
WHERE cat.type ='campaign' 
    AND is_approved=1 
    HAVING e.funding_goal_amount <= amount 
    GROUP BY `event_ac_id` LIMIT 8 
0

计算值,不能在WHERE条款。只有实际的列需要在那里使用。

如果要过滤事后WHERE条款已被执行,则可以使用HAVING声明