MySQL问题选择“IN”条件的查询

时间:2011-02-16 16:52:50

标签: sql mysql

我发现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)它确实识别并返回单个记录。

对这个奇怪问题的任何想法或我做错了什么?

4 个答案:

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

您需要将值字符串拆分为单独的值。看到这个问题......

Can Mysql Split a column?

以及提供的示例......

http://blog.fedecarg.com/2009/02/22/mysql-split-string-function/

答案 3 :(得分:0)