喜欢和不喜欢在一个mysql查询中

时间:2009-06-15 12:59:34

标签: mysql sql-like

我想做一个包含'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

4 个答案:

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

相关问题