我正在运行一个简单的查询,其中使用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]%' )
现在正确的结果将只包含id = 27707
的第二行,因为我在查询中提到将结果带到excluded_branch_id != %203%
处,但是我不明白为什么它给{{1 }}在203
列中。
请帮助!
答案 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));