我想做一个包含'like'和'not like'的查询。
当前示例:我希望所有内容都以“1 |%”开头,而不是“1 | 6 | 199 |%”或“1 | 6 | 200 |%”。
当前查询:
'SELECT * FROM `links` WHERE `category` LIKE '1|%' NOT LIKE '1|6|199|%','1|6|200|%' ORDER BY `score` DESC LIMIT 9'.
但这不起作用。有小费吗? THX
答案 0 :(得分:30)
只需添加“和类别”......
SELECT * FROM links
WHERE category LIKE '1|%'
AND category NOT LIKE '1|6|199|%','1|6|200|%'
ORDER BY score DESC LIMIT 9
实际上,逗号分隔条件不是我熟悉的语法。如果这不起作用,请尝试这样做:
SELECT * FROM links
WHERE category LIKE '1|%'
AND category NOT LIKE '1|6|199|%'
AND category NOT LIKE '1|6|200|%'
ORDER BY score DESC LIMIT 9
答案 1 :(得分:3)
您可以使用regexps
:
SELECT *
FROM links
WHERE category LIKE '1|%'
AND category NOT REGEXP '^1\\|6\\|(199|200)\\|'
ORDER BY
score DESC
LIMIT 9
请注意,REGEXP
不使用索引,而LIKE
则使用索引。
在此查询中,LIKE '1|%'
将使用category
上的索引(如果有)作为粗略过滤器,而REGEXP
将对结果进行精细过滤。
答案 2 :(得分:2)
我认为更大的问题是你已经对表进行了规范化。正确的答案是规范化你的表格。
但是如果你不能这样做,你应该使用逗号作为分隔符而不是FIND_IN_SET()
:
WHERE FIND_IN_SET('1', category) > 1
AND FIND_IN_SET('6', category) > 1
AND FIND_IN_SET('199', category) = 0
AND FIND_IN_SET('200', category) = 0
答案 3 :(得分:0)
也可以使用两个内连接,可能不是此查询的最佳解决方案,但仍然有用。
SELECT * FROM links
INNER JOIN(SELECT * FROM links WHERE category NOT LIKE'1 | 6 | 199 |%')AS escl1 ON(links.category = escl1.category)
INNER JOIN(SELECT * FROM links WHERE category NOT LIKE'1 | 6 | 200 |%')AS escl2 ON(links.category = escl2.category)
WHERE类别LIKE'1 |%'
ORDER BY
score
DESC LIMIT 9