正确使用 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的主要内容,如果未能解决你的问题,请参考以下文章
如何正确分组 Laravel Query Builder 中的 where 子句
Codeigniter:this->datatables->select(sample)->from(sample)->where()