MYSQL - 添加空外键表

时间:2016-07-09 16:35:46

标签: mysql

所以我一直有这个问题。

我有一个结构,表明商店在一个城市。

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

1 个答案:

答案 0 :(得分:1)

对于允许空值的情况,请使用LEFT JOIN。阅读how joins work here