MySQL查询逻辑辅助

时间:2015-12-23 12:24:42

标签: mysql sql null duplicates

我有一个MySQL查询,我需要能够输入一组多个序列号,并从数据库中获取任何匹配(和相应的数据)。

以下查询完美地没有关于货运代理商ID的最后一个WHERE子句,但是一旦我添加它,它就会给我正确的结果集(23条记录)加上217条(总共240条)相同的序列号货运代理商ID为NULL。我根据我的写法思考,它应该只显示结果集中的那些记录,无论货运代理是否为空,如果不是,那么货运代理商名称不为空。

以下是查询:

SELECT serialnumbers.serialNumber, serialnumbers.stolenItem,
serialdeals.ProfitCenterNo,
CASE WHEN (serialdeals.FFIDLookup IS NULL) THEN NULL ELSE freightforwarders.FreightFwderName END,
serialdeals.ProdIDLookup,
brands.brandName, stockitems.model,
serialdeals.EANIDLookup,
serialdeals.DealCancelled, serialdeals.DateOfDeal, serialdeals.DateEntered,
wb_users.UserName 
FROM serialnumbers,serialdeals,wb_users,stockitems, brands, freightforwarders 
WHERE serialnumbers.serialNumber IN 
(990003084921374,990003086488406,990003085170252,990003085303135,990003086126782,990003086603822,990003083637393,990003083743738,990003086609910,990003083745402,990003083610325,990003064133834,990003085044226,990003085489520,990003083334256,990003085932289,990003083357117,990003083614855,990003083697348,990003086421183,990003086564933,990003086628977,990002899811317,990002895682506)
AND  ((serialnumbers.DealIDLookup=serialdeals.DealUniqID) 
   OR (serialnumbers.DealIDLookup IS NULL AND serialnumbers.stolenItem=1))  
AND serialdeals.UserID=wb_users.UserId 
AND serialdeals.ProdIDLookup=stockitems.BaseStockItemId 
AND stockitems.brandID=brands.brandID 
AND ( serialdeals.FFIDLookup IS NULL 
   OR serialdeals.FFIDLookup=freightforwarders.FFID)

似乎不断向我展示使用NULL货运代理重复的相同序列号。这些SN中没有一个具有NULL交易ID和stolenItem = 1.

任何人都可以解释我的逻辑关闭的地方以及如何修复SQL语句以我想要的方式工作(即显示所有序列号和交易,即使货运代理是NULL,但应该只显示一个每个时间)

提前致谢!

1 个答案:

答案 0 :(得分:2)

而不是

AND ( serialdeals.FFIDLookup IS NULL 
   OR serialdeals.FFIDLookup=freightforwarders.FFID)

你需要LEFT JOIN

FROM serialnumbers,wb_users,stockitems, brands, 
     serialdeals LEFT JOIN freightforwarders ON serialdeals.FFIDLookup=freightforwarders.FFID

一般情况下,将条件从WHERE部分移至FROM并定义JOINs

是更好的选择