SQL查询未通过NOT LIKE返回期望的结果

时间:2018-11-12 18:42:12

标签: mysql sql

我正在运行一个简单的查询,其中使用TEXT比较NOT LIKE列,但结果不正确。尝试了很多但没有运气。这是查询:

SELECT *
FROM `restaurant_session_log`
WHERE `restId` = '176'
OR branchId = '203'
OR  `multi_vendorId` LIKE '%,176%' 
OR  `multi_vendorId` LIKE '%,176,%' 
OR  `multi_vendorId` LIKE '%176,%' 
OR  `multi_vendorId` LIKE '%[176]%' 
AND (`excluded_branch_id` NOT LIKE '%,203%'  OR `excluded_branch_id` NOT LIKE '%,203,%'  OR `excluded_branch_id` NOT LIKE '%203,%'  OR `excluded_branch_id` NOT LIKE '%[203]%' )

结果如下: screenshot

现在正确的结果将只包含id = 27707的第二行,因为我在查询中提到将结果带到excluded_branch_id != %203%处,但是我不明白为什么它给{{1 }}在203列中。

请帮助!

3 个答案:

答案 0 :(得分:1)

不要在单个字符串中存储多个值!不要将数字值放在字符串中!这是问题的根本原因。

有时候,您无法更改某人的非常非常糟糕的数据建模决策。您明显的问题是括号。

但是,如果您使用find_in_set(),则逻辑将得到简化。我想你打算:

WHERE (`restId` = '176' OR branchId = '203' OR
       find_in_set(176, `multi_vendorId`)
      ) AND
      (find_in_set(203, `excluded_branch_id`)

答案 1 :(得分:1)

您可以使用REGEXP简化匹配。如果203的两边都有单词边界,则它们与之匹配:

(excluded_branch_id IS NULL OR excluded_branch_id NOT REGEXP '[[:<:]]203[[:>:]]')

例如:

SELECT
    '203,111' REGEXP '[[:<:]]203[[:>:]]', -- 1
    '111,203' REGEXP '[[:<:]]203[[:>:]]', -- 1
    '1,203,1' REGEXP '[[:<:]]203[[:>:]]', -- 1
    '1120311' REGEXP '[[:<:]]203[[:>:]]'  -- 0

答案 2 :(得分:0)

$ query =“选择*从年份已发布的电影中,不像'200 _';”

$ result = db_query($ query,array(':movies'=> $ value));