希望你能帮助我。
我有一个MySQL查询,在尝试仅获取某些广告所有者(即LIKE
)时,使用userId
选项通过搜索关键字从我的SELECT a.id, a.userId as adOwnerId, a.name, a.phoneNumber, a.categoryId, a.cityId, a.description, a.dateCreated, a.dateModified
FROM ads a
INNER JOIN categories c ON c.id = a.categoryId
INNER JOIN categories_lang cl ON c.id = cl.categoryId
WHERE a.name LIKE '%someKeyword%'
OR a.description LIKE '%someKeyword%'
OR cl.name LIKE '%someKeyword%'
AND a.userId IN (9, 6, 5, 12, 8, 2)
ORDER BY a.dateCreated DESC
表中获取广告。 / p>
我的代码是这样的:
IN
我的问题是,OR a.description LIKE '%someKeyword%'
OR cl.name LIKE '%someKeyword%'
条款根本不起作用。
虽然,如果我删除这些行:
{{1}}
然后它很棒。
我哪里出错了?
谢谢:)
答案 0 :(得分:3)
您需要使用括号来保护AND
的{{1}}:
OR
否则,你有这个:
(
a.name LIKE '%someKeyword%'
OR a.description LIKE '%someKeyword%'
OR cl.name LIKE '%someKeyword%'
)
AND a.userId IN (9, 6, 5, 12, 8, 2)
默认情况下与此相同:
A OR B OR C AND D
这意味着只要A OR B OR (C AND D)
或A
为真,整个表达式就为真。
由于问题的标题,我也将扩展我的答案给那些可能来到这里寻找不同问题的人。通常,有人询问混合B
和IN()
的人会尝试这样做:
LIKE
而不是:
WHERE column INLIKE ('x%', 'y%', 'z%')
当然,没有WHERE column LIKE 'x%' OR column LIKE 'y%' OR column LIKE 'z%'
运算符这样的东西。为了解决这个问题,我经常告诉他们将值放入派生表中,并使用LIKE表达式连接到表:
INLIKE
这里的技巧是确保连接条件只能匹配源表中每个记录的派生表中最多一个可能的条目,或者使用GROUP BY或其他机制({{1} } / with inlike as
select <columnlist>
from myTable t
inner join
(select 'x%' as val union select 'y%' union select 'z%') u
on t.column like u.val
可以做到这一点,但只有现代数据库引擎--MySql已经
答案 1 :(得分:1)
您需要将ORed语句包装在括号中:
SELECT a.id, a.userId as adOwnerId, a.name, a.phoneNumber, a.categoryId,
a.cityId, a.description, a.dateCreated, a.dateModified
FROM ads a
INNER JOIN categories c ON c.id = a.categoryId
INNER JOIN categories_lang cl ON c.id = cl.categoryId
WHERE (
a.name LIKE '%someKeyword%'
OR a.description LIKE '%someKeyword%'
OR cl.name LIKE '%someKeyword%'
)
AND a.userId IN (9, 6, 5, 12, 8, 2)
ORDER BY a.dateCreated DESC
答案 2 :(得分:0)
如果使用括号指定条件顺序,它将起作用。
以下示例:
(
a.name LIKE '%someKeyword%'
OR a.description LIKE '%someKeyword%')
OR cl.name LIKE '%someKeyword%'
)
AND a.userId IN (9, 6, 5, 12, 8, 2)
您必须知道搜索的优先级。