2015-07-10 47 views
1

我已经编写了一个基于关键字/选择菜单搜索系统构建查询的php脚本。该脚本的伟大工程的权利,直到我尝试在列别名搜索:列别名在WHERE子句中不可用

SELECT 
    contacts.*, 
    orders.order_id AS is_customer, 
    purchases.purchase_id AS is_supplier 
FROM contacts 
LEFT JOIN orders ON orders.customer_id=contacts.contact_id 
LEFT JOIN purchases ON purchases.supplier_id=contacts.contact_id 
WHERE is_customer IS NOT NULL 
AND contacts.account_id=1 
GROUP BY contact_id 
ORDER BY contact_company_name 

这是这就是问题所在行WHERE is_customer IS NOT NULL - MySQL的告诉我,它不存在。我明白为什么这样,但这对我没有帮助。

我试图根据提示,我在这里读Unknown Column In Where Clause,从而将其更改为HAVING is_customer IS NOT NULL

SELECT 
    contacts.*, 
    orders.order_id AS is_customer, 
    purchases.purchase_id AS is_supplier 
FROM contacts 
LEFT JOIN orders ON orders.customer_id=contacts.contact_id 
LEFT JOIN purchases ON purchases.supplier_id=contacts.contact_id 
HAVING is_customer IS NOT NULL 
AND contacts.account_id=1 
ORDER BY contact_company_name 

...这查询工作就好提供我删除GROUP BY条款。显然这会打破我的结果。

任何人都可以帮助我擦亮这个查询吗?

+2

我看不出有任何的聚合,从而将WHERE orders.order_id不为空会工作 – FirebladeDan

回答

0

不知道它是否通常会回答你自己的问题,但我通过阅读本页https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html了解它的工作原理。

我发现声明与GROUP BY一起工作得很好,我只需要重新排列声明的顺序。该GROUP BY而来的WHERE后,但在HAVING之前,像这样:

SELECT 
    contacts.*, 
    orders.order_id AS is_customer, 
    purchases.purchase_id AS is_supplier 
FROM contacts 
LEFT JOIN orders ON orders.customer_id=contacts.contact_id 
LEFT JOIN purchases ON purchases.supplier_id=contacts.contact_id 
AND contacts.account_id=1 
GROUP BY contact_id 
HAVING is_supplier IS NOT NULL 
ORDER BY contact_company_name