SQL查询,同时使用IN和LIKE。可能?

时间:2017-02-06 22:55:46

标签: mysql sql

希望你能帮助我。

我有一个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}}

然后它很棒。

我哪里出错了?

谢谢:)

3 个答案:

答案 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为真,整个表达式就为真。

由于问题的标题,我也将扩展我的答案给那些可能来到这里寻找不同问题的人。通常,有人询问混合BIN()的人会尝试这样做:

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已经方式落后于ansi标准,不再符合条件 - 支持它们来限制第一场比赛。

答案 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)

您必须知道搜索的优先级。