2012-08-28 49 views
0

我想写一个查询,将拉动一些产品信息和照片,如果产品有任何。mySQL联盟允许非匹配

select 
    prod.pID, prod.Manufacturer_Name, prod.pUPC, prod.pNum, prod.pPrice, prod.pSalesPrice, prod.pSalesDate, prod.pSalesEndDate, prod.pSale, 
    GROUP_CONCAT(photoName) as photos 
from 
    ds_products as prod 
    inner join ds_photos as pics on pics.objectID=prod.pID 
where 
    pics.photoFlag =2 
group by 
    prod.pID 

问题在于没有照片的产品会被遗漏在结果集之外。我需要添加和/或更改哪些内容才能让没有出现在照片列表中的产品显示在结果中?

感谢

编辑

我试过LEFT JOIN代替内,但得到相同的结果集。如果我只是跑:

select 
    prod.pID, prod.Manufacturer_Name, prod.pUPC, prod.pNum, prod.pPrice, prod.pSalesPrice, prod.pSalesDate, prod.pSalesEndDate, prod.pSale 
from 
    ds_products as prod 

我得到约600k结果。内连接或左连接查询获得约19万个结果。有没有另一种方法来做到这一点?

回答

2

使用外连接

select 
    prod.pID, prod.Manufacturer_Name, prod.pUPC, prod.pNum, prod.pPrice, prod.pSalesPrice, prod.pSalesDate, prod.pSalesEndDate, prod.pSale, 
    GROUP_CONCAT(photoName) as photos 
from 
    ds_products as prod 
    LEFT join ds_photos as pics on pics.objectID=prod.pID 
where 
    pics.photoFlag =2 OR pics.photoFlag is NULL 
group by 
    prod.pID 

我已经添加了检查photoFlag为null,对于不具备相应的图片 这里的产品的条件正在拨弄:http://sqlfiddle.com/#!2/c2a9c/1/0

欲了解更多信息: http://dev.mysql.com/doc/refman/5.0/en/outer-join-simplification.html

+0

请看上面编辑 – baiano

+0

@baiano,我刚刚编辑了答案,只是检查它是否工作 – Ankur

+0

OR是NULL得到了一切,谢谢。 – baiano

0

您需要使用LEFT JOIN而不是INNER JOIN这样

select 
    prod.pID, prod.Manufacturer_Name, prod.pUPC, prod.pNum, prod.pPrice, prod.pSalesPrice, prod.pSalesDate, prod.pSalesEndDate, prod.pSale, 
    GROUP_CONCAT(photoName) as photos 
from 
    ds_products as prod 
    LEFT JOIN ds_photos as pics on pics.objectID=prod.pID 
group by 
    prod.pID 

注意我还删除了where子句,因为这是在pics表中查找会限制结果集的值。

+0

请参阅上面编辑 – baiano

+1

我看到一个可能的问题,因为你也通过pics.photoFlag = 2来限制记录。如果图片中没有记录,这基本上会打败左连接的目的,所以你可能想要删除它。我编辑了我的答案。 –

+0

photoflag选项的原因是因为db存储了每个产品图像的多个版本的链接(thumb,full等),并且photoFlag = 2代表完整图像。我不想测试结果集的图像大小,以知道使用哪个。或者,有没有一种方式来标记每个照片的URL与它的photoflag值?比如2 * url_for_flag = 2,4 * url_for_flag = 4等 – baiano