正确使用 SELECT WHERE NOT IN

Posted

技术标签:

【中文标题】正确使用 SELECT WHERE NOT IN【英文标题】:Proper use of SELECT WHERE NOT IN 【发布时间】:2012-08-14 22:54:19 【问题描述】:

我正在为一个带有 php Web 界面的小书店建立一个数据库。对于这个问题,我想显示“产品”表 (prod_core) 中的所有记录,而不显示产品字段“条形码”中的值等于“销售”表 (inc_core) 中的“描述”字段的记录。

实际上,我设法让第一个“销售”突变工作,但是每当我向“销售”表添加第二条记录时,查询就不再起作用了。 (添加的第一条记录除外)。这是我的 SQL 代码:

选择 prod_core.prodID、prod_core.title、prod_core.location、prod_core.genre、
       prod_core.price, prod_core.barcode
来自 prod_core
在哪里 prod_core.barcode 不在(
         选择“描述”
         FROM inc_core
         按 prod_core.prodID 分组)

我想这与 SQL 不循环有关(它停止在表中搜索符合要求的记录),但我不确定。我将非常感谢任何帮助!

【问题讨论】:

这看起来不应该解析。 “description”不在 group by 列表中。 @WalterMitty 。 . .那是mysql的一个“特性”。在谷歌上查找“mysql隐藏列”。 【参考方案1】:

我建议使用LEFT JOIN 而不是NOT IN

SELECT
    prod_core.prodID, 
    prod_core.title, 
    prod_core.location, 
    prod_core.genre, 
    prod_core.price, 
    prod_core.barcode
FROM 
    prod_core 
    LEFT JOIN inc_core ON inc_core.`description` = prod_core.barcode
WHERE
    inc_core.`description` IS NULL

另外,由于SELECT 语句中的所有列都不是聚合函数的一部分,因此我删除了GROUP BY 并将其替换为DISTINCT... 但是,我不明白为什么此表应包含重复项。

编辑:我误读了您的查询,尽管 group by 在外部查询上,而不是在子查询上... +1 到其他答案。

【讨论】:

非常感谢迈克尔弗雷德里克森!你设法在一分钟内解决了我的小问题,我整天都在这个问题上打破了我的背......这个网站很棒。再次感谢! @GeoffreyBergman 不客气,很高兴它成功了;如果这回答了您的问题,please mark it as the accepted answer。 刚刚做到了!不得不等 8 分钟。【参考方案2】:

您的查询的问题是分组依据是一个字段,但您正在选择另一个字段。这意味着您的子查询正在为每个产品选择任意描述。无法保证您会获得预期的完整列表。

解决此问题的最简单方法是通过以下方式删除组:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre,
       prod_core.price, prod_core.barcode
FROM prod_core
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core)

但是,这可能效率低下。对于带有子查询的“in”,最好的优化是使用 exists。此外,请确保描述中存在索引。这是一个替代版本,专门用于 mysql:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre,
       prod_core.price, prod_core.barcode
FROM prod_core
WHERE not exists (select 1 from inc_core where inc_core.description = prod_core.barcode)

就我个人而言,我不太喜欢将相关子查询作为“in”的替代品。但是,这是 mysql 最优化的方法。

【讨论】:

【参考方案3】:

我认为你不需要 group by 子句,所以你应该可以使用:

SELECT prod_core.prodID, prod_core.title, prod_core.location, prod_core.genre, prod_core.price, prod_core.barcode
FROM prod_core
WHERE prod_core.barcode NOT IN (SELECT `description` FROM inc_core)

【讨论】:

以上是关于正确使用 SELECT WHERE NOT IN的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 中正确输入 sql where 子句?

如何正确分组 Laravel Query Builder 中的 where 子句

经常看到SQL语句中的where 1=1是啥意思?

Codeigniter:this->datatables->select(sample)->from(sample)->where()

聚合函数字段注意.where和having的区别

sql select where like 变量模糊查询