如何使用外键关系(包括没有相应条目的条目)加入MYSQL多个表

时间:2015-10-08 11:59:44

标签: mysql join foreign-keys foreign-key-relationship

您好我有一个资源中央表,它通过外键表链接到类别和活动。

所以表格是:
资源(r):
-id
-name
resources_categories (rc):
-resource_id(=上面的r.id)
-category_id(=下面的c.id)
类别(c):
-category_id(=上面的c.id)
-category_name

resources_activities (ra):
-resource_id(=上面的r.id)
-activity_id(=下面的a.id)
活动(a):
-activity_id(=上面的a.id) -activity_name

我想从资源中选择项目,即使没有相应的外键输入分配类别或活动,因为资源和类别之间存在1对多(或1对无)的关系,资源和活动。
即所有具有其类别和活动的资源(如果有的话)

但似乎无法这样做,即使尝试了各种连接和联合并尝试使用where null或者不为null或者是<>'等等

这是一个有效但不包含所有资源的查询:

SELECT `r`.`id` ,  `r`.`name`, GROUP_CONCAT(DISTINCT `c`.`category_name`), GROUP_CONCAT(DISTINCT `a`.`activity_name`)  
FROM `resources` AS `r`   
RIGHT JOIN `resources_categories` AS `rc` ON `r`.`id` = `rc`.`resource_id`   
JOIN `categories` AS `c` ON `rc`.`category_id` = `c`.`id`   
RIGHT JOIN `resources_activities` AS `ra` ON `r`.`id` = `ra`.`resource_id`   
JOIN `activities` AS `a` ON `ra`.`activity_id` = `a`.`id`   
GROUP BY `r`.`id`

此处资源类别是一个外键表,它将资源与其类别和活动相连接。 但是这没有列出没有类别或活动列表的资源条目 - 我该怎么做?

2 个答案:

答案 0 :(得分:1)

然后你想要一个std::basic_string< myChar >而不是left join

right join

当没有匹配时,SELECT r.id, r.name, GROUP_CONCAT(DISTINCT c.category_name), GROUP_CONCAT(DISTINCT a.activity_name) FROM resources r LEFT JOIN resources_categories rc ON r.id = rc.resource_id LEFT JOIN categories c ON rc.category_id = c.id LEFT JOIN resources_activities ra ON r.id = ra.resource_id LEFT JOIN activities a ON ra.activity_id = a.id GROUP BY r.id; 会保留第一个表中的所有行。 LEFT JOIN会将所有行保留在第二个中。大多数人发现阅读具有RIGHT JOIN s链而不是LEFT JOIN s的查询要容易得多。混合两种不同类型的连接很少有(好的)原因。

答案 1 :(得分:0)

资源AS r RIGHT JOIN resources_categories join从右侧的表中选择所有行,因此从resource_categories表中选择。因此,代替右连接,在查询中使用左连接来返回所有资源,而不管其他表中的相应记录