您好我有一个资源中央表,它通过外键表链接到类别和活动。
所以表格是:
资源(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`
此处资源类别是一个外键表,它将资源与其类别和活动相连接。 但是这没有列出没有类别或活动列表的资源条目 - 我该怎么做?
答案 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表中选择。因此,代替右连接,在查询中使用左连接来返回所有资源,而不管其他表中的相应记录