sql - MySQL Select 查询存在 "IN"条件的问题

标签 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是advertisement_urls表的一列,其值为逗号分隔的整数,例如4,2 或 2,7,3 等

因此,如果 hide_from_publishers 包含相同的上述两个值,它应该只返回“4,2”的记录,但它返回两条记录

现在,如果我将第二组的 hide_for_columns 的值更改为 3,2,7 并再次运行查询,它将返回单个记录,这是正确的输出。

如果我在那里使用直接值,即 (2,7,3),它会识别并返回单个记录,而不是 hide_from_publishers。

对这个奇怪的问题有什么想法还是我做错了什么?

最佳答案

元组(1, 2, 3)和字符串"1, 2, 3"之间存在差异。前者是三个值,后者是单个字符串值,恰好在人眼中看起来像三个值。就 DBMS 而言,它仍然是单个值。

如果您想要多个值与一条记录关联,则不应将其存储为单个字段中的逗号分隔值,而应将其存储在另一个表中并连接它。这样数据就保持结构化,您可以将其用作查询的一部分。

关于sql - MySQL Select 查询存在 "IN"条件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5019440/

相关文章:

mysql - 从 MySQL 中的日期时间计算月份数

mysql - 如何将相同的数据合并到水平表中

mysql - Symfony2 : List cities by country

php - <div> 类没有在 php 中显示

php - 自动为列中的重复值分配相同的 ID

php - Mysql 用函数关联两个表

SQLite 按日期排序1530019888000

sql - Postgres 类似于 SQL Server 中的 CROSS APPLY

php - mysql php 应用程序中的默认日期过滤器

mysql - 如何为特定时区的用户进行 mysql SELECT