所以我一直有这个问题。
我有一个结构,表明商店在一个城市。
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 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