我发现MySQL select语句在where子句中有“IN”这个奇怪的问题:
我正在尝试此查询:
SELECT ads.*
FROM advertisement_urls ads
WHERE ad_pool_id = 5
AND status = 1
AND ads.id = 23
AND 3 NOT IN (hide_from_publishers)
ORDER BY rank desc
在上面的SQL中,hide_from_publishers是advertise_urls表的一列,其值为逗号分隔的整数,例如: 4,2或2,7,3等。
因此,如果hide_from_publishers包含相同的上述两个值,则它应仅返回“4,2”的记录,但它会返回两个记录
现在,如果我将第二个设置的hide_for_columns的值更改为3,2,7并再次运行查询,它将返回单个记录,这是正确的输出。
如果我在那里使用直接值,而不是hide_from_publishers,即(2,7,3)它确实识别并返回单个记录。
对这个奇怪问题的任何想法或我做错了什么?
答案 0 :(得分:3)
元组(1, 2, 3)
和字符串"1, 2, 3"
之间存在差异。前者是三个值,后者是单个字符串值,恰好看起来像人眼的三个值。就DBMS而言,它仍然是单一值。
如果您想要一个与记录关联的值,则不应将其作为逗号分隔值存储在单个字段中,您应将其存储在另一个表中并加入它。这样,数据仍然是结构化的,您可以将其用作查询的一部分。
答案 1 :(得分:1)
您需要将逗号分隔的hide_from_publishers
列视为字符串。您可以使用LOCATE函数来确定您的值是否存在于字符串中。
请注意,我已在两个字符串中添加了前导和尾随逗号,以便搜索“3”时不会意外地匹配“13”。
select ads.*
from advertisement_urls ads
where ad_pool_id = 5
and status = 1
and ads.id = 23
and locate(',3,', ','+hide_from_publishers+',') = 0
order by rank desc
答案 2 :(得分:0)
您需要将值字符串拆分为单独的值。看到这个问题......
以及提供的示例......
http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/
答案 3 :(得分:0)