2012-08-14 108 views
1

我正在建立一个PHP网页界面的小书店的数据库。对于这个问题,我想显示'产品'表(prod_core)中的所有记录,而没有在'销售'表(inc_core)中的产品字段'条形码'中的'描述'字段中有值的记录。正确使用SELECT WHERE NOT IN

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

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 
     GROUP BY prod_core.prodID)

我想它是与SQL不循环(即停止对该表查找符合要求的记录),但我不知道。我非常感谢任何帮助!

+0

这看起来应该不解析。 “说明”不在组列表中。 – 2012-08-14 22:58:28

+0

@WalterMitty。 。 。这是mysql的一个“特性”。在google上查找“mysql hidden columns”。 – 2012-08-14 23:02:13

回答

3

我建议的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的其他答案,抓住了这一点。

+0

非常感谢Michael Fredrickson!你在一分钟内就设法解决了我的小问题,整个一天我都在这个问题上背弃了自己......这个网站真棒。再次感谢! – 2012-08-14 23:01:43

+0

@GeoffreyBergman不客气,很高兴它的工作;如果这回答了你的问题,[请将其标记为接受的答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 – 2012-08-14 23:07:34

+0

刚刚做到了!必须等待8分钟。 – 2012-08-14 23:10:05

1

我不认为你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) 
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) 

就个人而言,我不是相关子查询作为“中的”更换的大风扇。但是,这是mysql最优化的方法。