1

我正在为一个带有 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 不循环有关(它停止在表中搜索符合要求的记录),但我不确定。我将非常感谢任何帮助!

4

3 回答 3

3

我建议 aLEFT JOIN而不是 a 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 到其他答案。

于 2012-08-14T22:57:02.360 回答
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 最优化的方法。

于 2012-08-14T23:06:29.097 回答
1

我认为您不需要 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)
于 2012-08-14T23:00:52.877 回答