我需要从5个表中获取数据(每个表的所有列)都有FK,这是单个表的PK。
但有些表可能有记录可能是空的。如果数据存在于相应的列/表上,则应返回null /默认值
子表与父表之间存在一对多和一对一的关系。
到目前为止我已经尝试过了 - UNION,它有相同数量的列 - CROSS JOIN不返回任何数据 - SELECT ALL_COLUMN FROM ALL_TABLE WHERE TABLE.FK = ID不返回任何数据 - LEFT JOIN工作2个表但不超过
SELECT A.GENDER, B.BLOCKED_USER FROM t_macroworld_registration AS A
LEFT JOIN t_macroworld_blacklist AS B ON 1=1 WHERE A.ID=15
我可以在MySQL的视图中实现此功能的方法有哪些。
答案 0 :(得分:0)
外部联接操作是规范模式......
SELECT ...
FROM a
LEFT JOIN b ON b.a_id = a.id
LEFT JOIN c ON c.a_id = a.id
LEFT JOIN d ON d.a_id = a.id
WHERE a.id = 15
外连接表上的谓词必须位于ON
子句而不是WHERE
子句中。如果WHERE子句中有任何谓词,则要求来自其中一个外连接表的值为非NULL,这将取消连接的“外部性”,使其成为内连接。
当b,c和d中有多个匹配行时,结果出现“大摇滚”问题。如果b中有五行匹配,c中有三行匹配,b中有两行匹配,那么它看起来会像重复一样。 (5x3x2 =要返回30行,这些行上有大量重复数据。)
答案 1 :(得分:0)
最后我解决了它, 我把每个表中的FK基于FK打破了很多选择查询,因此额外的行返回和映射的数量变得很容易。
谁有可能遇到这种问题,如果有可能,那么将其分解为多个选择查询而不是一个。
答案 2 :(得分:-2)
SELECT
w.id,w.name,a.address,i.name,i.quantity
FROM
warehouse w
LEFT JOIN address AS a ON a.warehouse_id = w.id
LEFT JOIN item AS i ON i.warehouse_id = w.id
LEFT JOIN order AS o ON o.item_id = i.id
WHERE
w.id = 1
GROUP BY 1,2,3,4;
将为您提供仓库库存和订单的概览。这也将复制一些结果。 假设有2个仓库,每个仓库1个,每个仓库3个项目,2个按项目排序= 2 * 3 * 2 = 12行
我建议逐步添加LEFT JOIN
并逐步显示每个阶段的结果。您将很快理解为什么线路会倍增。
请注意在表中使用外键和id来链接表。