在SQL中为已连接的表添加其他连接

时间:2014-11-06 00:36:57

标签: mysql join

我有一个现有的查询,我正在使用连接(感谢RADAR)来获取我的数据。

使用SQL

SELECT
 IFNULL(f.field_full_name_value, 'No Value'), u.name, u.uid, n.title, n.nid, a.timestamp, d.field_video_duration_value AS duration
FROM
db_node_view_count a
join db_node n
ON a.nid = n.nid
JOIN db_field_data_field_video_duration d
ON n.nid = d.entity_id
JOIN db_users u
ON a.uid = u.uid
AND u.uid <> 1
LEFT JOIN db_field_data_field_full_name f 
ON u.uid = f.entity_id
ORDER BY u.uid desc

我想要做的是我想扩展查询以显示db_users u的角色。有一个名为db _ roles的表,它包含具有主键rid的所有角色名称。然后第二个表是db_users_roles,其中包含匹配的uid(来自db_users u),并显示哪个用户选择了哪个角色。

所以我做的是在ON a.uid = u.uid下,我添加了JOIN db_users_roles ur ON u.uid = ur.uid JOIN db_role r ON ur.rid = r.rid。它工作正常但它显示重复的行。知道为什么会这样吗?

SELECT
 IFNULL(f.field_full_name_value, 'No Value'), r.name, u.name, u.uid, n.title, n.nid, a.timestamp, d.field_video_duration_value AS duration
FROM
db_node_view_count a
join db_node n
ON a.nid = n.nid
JOIN db_field_data_field_video_duration d
ON n.nid = d.entity_id
JOIN db_users u
ON a.uid = u.uid
LEFT JOIN db_users_roles ur
ON u.uid = ur.uid 
LEFT JOIN db_role r
ON ur.rid = r.rid 
AND u.uid <> 1
LEFT JOIN db_field_data_field_full_name f 
ON u.uid = f.entity_id
ORDER BY u.uid desc

更新

在Joe的帮助下,这是一个小小的更新:

SELECT
 IFNULL(f.field_full_name_value, 'No Value'), GROUP_CONCAT(r.name), u.name, u.uid, n.title, n.nid, a.timestamp, d.field_video_duration_value AS duration
FROM
db_node_view_count a
join db_node n
ON a.nid = n.nid
JOIN db_field_data_field_video_duration d
ON n.nid = d.entity_id
JOIN db_users u
ON a.uid = u.uid
LEFT JOIN db_users_roles ur
ON u.uid = ur.uid 
LEFT JOIN db_role r
ON ur.rid = r.rid 
AND u.uid <> 1
LEFT JOIN db_field_data_field_full_name f 
ON u.uid = f.entity_id
GROUP BY f.field_full_name_value
ORDER BY u.uid desc

1 个答案:

答案 0 :(得分:1)

您的(Drupal)数据库中的某些用户可能有多个角色。因此,如果您的原始查询每个节点有一行(简化了一点),则修改后的查询将复制用户每个角色的行。

您可能希望修改要包含的查询 GROUP BY n.nid,u.uid 并更改SELECT字段列表以包括GROUP_CONCAT(r.name)而不是r.name。