21

我想做一个包含“喜欢”和“不喜欢”的查询。

当前示例:我想要以 '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'.

但这不起作用。有小费吗?谢谢

4

4 回答 4

35

只需添加“和类别”...

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
于 2009-06-15T13:00:44.960 回答
2

您可以使用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's 将精细过滤结果。

于 2009-06-15T13:05:10.470 回答
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
于 2009-06-15T15:42:58.563 回答
0

也可以使用两个内连接,这可能不是此查询的最佳解决方案,但仍然很有用。

从链接中选择 *

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|%'

score按DESC 限制订购9

于 2014-01-29T10:43:32.903 回答