所以我一直有这方面的问题。
我有一座建筑,上面写着一家商店在城市里。
table Stores
store (pk)
city (fk)弄到它们很好。然后我添加store_info
table store_info
store (pk)
adress
phone
description因此,我们得到了以下查询:
SELECT stores.ID, store_info.address, store_info.phone
FROM store_info, stores
WHERE stores.city = 1
AND stores.ID = store_info.storeID现在,一切都很顺利。然而,我加入FROM store_brands的那一刻
SELECT stores.ID, store_info.address, store_info.phone
FROM store_info, stores, store_brands, brands
WHERE stores.city = 1
AND stores.ID = store_info.storeID最后一个查询无法给出结果,但查询没有失败。
问题是,我将商店与品牌分开存储,并通过一个关系表(2个外键)将品牌链接到商店,看起来就像这样:
store_brands
storeID (fk to stores)
brandID (fk to brands)设置的全部要点(正如您可能知道的)是,我可以通过使用GROUP_CONCAT收集所有品牌。从技术上讲,只要商店在store_brands表中至少有一个关系,查询就能很好地工作。
现在,我想做的是,我想要得到的商店完全不管它是否有联系的品牌。这些相同的品牌也可以通过连锁链接(1层以上),所以我想收集这两个实例,这意味着我仍然希望商店出现,即使它没有任何品牌填写。
我不明白为什么store_brands中必须有一行才能显示简单的select查询。有人能帮我吗?我在结构上犯了大错吗?
为了清晰起见,编辑:顺便说一句,--这是整个查询。它运行良好,但同样,只有当商店实际上有品牌链接到它时才能工作:(之前的查询是关于它哪里出错的调试器)。
SELECT store_info.storeID, store_info.display_name, store_info.address, store_info.phone, GROUP_CONCAT(brands.display_name ORDER BY brands.name) AS brands
FROM store_info, brands, stores, store_brands
WHERE stores.city = 1
AND store_brands.store = stores.ID
AND brands.id = store_brands.brand
AND stores.ID = store_info.storeID
GROUP BY store_info.storeID
ORDER BY store_info.display_name更新和应答
感谢idg提供的源代码,我了解了如何用左联接替换常规联接,以及如何返回NULL。
新的工作查询:
SELECT stores.ID, store_info.display_name, store_info.address, store_info.phone, GROUP_CONCAT(brands.display_name ORDER BY brands.name) AS brands
FROM store_info, stores
LEFT JOIN store_brands ON stores.ID = store_brands.store
LEFT JOIN brands ON store_brands.brand = brands.ID
WHERE stores.city = 1
AND stores.ID = store_info.storeID
GROUP BY store_info.storeID
ORDER BY store_info.display_name发布于 2016-07-09 16:41:11
对于允许空值的情况,请使用LEFT JOIN。读一读如何在这里工作。
https://stackoverflow.com/questions/38283958
复制相似问题