2016-12-07 126 views
1

我有全文搜索,并在WHERE状态正常的搜索和额外的JOIN这样MySQL的 - 如何编写SELECT语句中正确

SELECT 
customer.*, 
countries.name as country 
FROM customer 
LEFT JOIN countries ON countries.ID = customer.country_id 
WHERE customer.num = :keyword 
    OR customer.city = :keyword 
    OR customer.email = :keyword 
    OR MATCH (customer.company) AGAINST (:keyword) 
    OR countries.name = :keyword 

查询与全文检索的组合一个MySQL SELECT声明成(customer.company)柱只要TABLE.COLUMN countries.name是的WHERE条件部分返回no result。但是询问countries.name本身是成功的。

如何正确编写的SELECT语句返回使用从上面的例子所有WHERE组件的组合成功的查询?

编辑:

在以前的版本我用这个statment

SELECT 
    customer.* , 
    countries.name 
    FROM customer, countries 
    WHERE customer.country_id=countries.ID 
    AND MATCH (customer.company) AGAINST (:keyword) 

    UNION 

    SELECT 
    customer.*, 
    countries.name 
    FROM customer, countries 
    WHERE customer.country_id=countries.ID 
    AND countries.name=:keyword 

效果很好。我只是不知道这是否是使用不同搜索(全文和普通)查询两个表的有效方式。另外,当我搜索超过2列时,代码很容易被炸毁,这是我想避免的。

任何更多的想法和帮助是值得欢迎

+0

如果它是零,你可以把一个简单的数据我不明白你的目标,它的预期结果 – Beginner

回答

0

您应该检查NULLs,因为你使用的是LEFT JOIN

SELECT 
    customer.*, 
    countries.name as country 
FROM customer 
LEFT JOIN countries ON countries.ID = customer.country_id 
WHERE customer.num = :keyword 
    OR customer.city = :keyword 
    OR customer.email = :keyword 
    OR MATCH (customer.company) AGAINST (:keyword) 
    OR (countries.name = :keyword OR countries.name IS NULL) 

只是为了澄清,在LEFT JOIN的右表的条件,应只放在在ON条款,而不是WHERE子句中。这是一个有点不同,因为要比较它与所有其他条件,因此 - 在NULL比较。

+0

'IS Null'更新的条件 - 同样的问题 – Ben

+0

从上面继续评论:正如我在上面的问题中写的,对'countries.name'(第二个表)的查询已成功,但没有成为custome r.company'(全文专栏)。只有当我删除WHERE子句'countries.name'时,我才能得到结果。 – Ben

+0

如何放置一个'WHERE'子句'LEFT JOIN'语句的'ON'子句中? – Ben

0

我的解决办法是刚刚设置的默认值= ''countries.name使用CASE WHEN

(CASE WHEN countries.name is null then 'default value' else countries.name END) 

新的查询

SELECT 
customer.*, 
countries.name as country 
FROM customer 
LEFT JOIN countries ON countries.ID = customer.country_id 
WHERE customer.num = :keyword 
    OR customer.city = :keyword 
    OR customer.email = :keyword 
    OR MATCH (customer.company) AGAINST (:keyword) 
    OR (CASE WHEN countries.name is null then '' else countries.name END) = :keyword 
+0

对不起,我不明白你的建议。你可以请张贴完整的SELECT样本吗? – Ben

+0

'OR(:keyword ==''AND countries.name为null)'产生pphp'parse error' – Ben

+0

我可以看到你的php也许它是一个转义字符串错误 – Beginner