我有一个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,但应该只显示一个每个时间)
提前致谢!
答案 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