如何在MySQL

时间:2017-10-06 21:43:28

标签: mysql sql

我需要从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的视图中实现此功能的方法有哪些。

3 个答案:

答案 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来链接表。

祝你好运