2015-11-03 52 views
1

SQLFiddle:http://sqlfiddle.com/#!9/9d5b2的MySQL 5.6:多重左连接通向正确填写列

我有MYSQL 5.6下下表:

users 
id | name 
--------- 
1 | John 


groups 
id | name 
--------- 
1 | admin 


constaints 
id | name 
------------ 
1 | cons1 
2 | cons2 


user_to_group 
userid | groupid 
---------------- 
1  | 1 

constraint_to_group 
constrainid | groupid 
---------------------- 
1   | 1 

constraint_to_user 
constrainid | userid 
---------------------- 
2   | 1 

的理念是:

  • 我有有限制的组
  • 用户可以成员或0..n的
  • 约束也可直接关联到用户

我试图建立一个返回查询,对于特定用户,

  • 其全部
  • 约束这些
  • 约束直接关联到他

我做了以下内容:

SELECT `users`.*, 
     `constraints`.id as cons_id, 
     `constraints`.name as cons_name, 
     `groups`.id as group_id, 
     `groups`.name as group_name 
FROM `users` 
    LEFT JOIN `user_to_group` 
     ON `user_to_group`.userid=`users`.id 
    LEFT JOIN `groups` 
     ON `groups`.id=`user_to_group`.groupid 
    LEFT JOIN `constraint_to_group` 
     ON `constraint_to_group`.groupid=`user_to_group`.groupid 
    LEFT JOIN `constraint_to_user` 
     ON `constraint_to_user`.userid=`users`.id 
    LEFT JOIN `constraints` 
     ON (`constraints`.id=`constraint_to_group`.constraintid OR `constraints`.id=`constraint_to_user`.constraintid) 
WHERE `users`.id=1 

这让我:

|id| name |cons_id|cons_name|group_id|group_name 
------------------------------------------------ 
|1 | john |1  |cons1 |1  |admin 
|1 | john |2  |cons2 |1  |admin 

我的问题:

cons2并非来自组管理,它直接与用户相关的,所以我想GROUP_ID组名设置为NULL(或其他东西),所以我可以知道约束是来自一个组还是直接与用户相关联

回答

1

可以执行constraint_to_group.constraintidconstraints.id之间的比较。

因此,而不是:

`groups`.id as group_id, 
    `groups`.name as group_name 

使用:

IF(`constraint_to_group`.constraintid = `constraints`.id, 
     `groups`.id, NULL) as group_id, 
    IF(`constraint_to_group`.constraintid = `constraints`.id, 
     `groups`.name, NULL) as group_name 
SELECT子句中

Demo here

+0

谢谢! :) – IggY

0

您不能将它们设置为NULL。但是如果你想获得cons_name的所有值,你可以使用GROUP_CONCAT函数。

SELECT `users`.*, 
     `constraints`.id as cons_id, 
     GROUP_CONCAT(`constraints`.name) as cons_name, 
     `groups`.id as group_id, 
     `groups`.name as group_name 
FROM `users` 
    LEFT JOIN `user_to_group` 
     ON `user_to_group`.userid=`users`.id 
    LEFT JOIN `groups` 
     ON `groups`.id=`user_to_group`.groupid 
    LEFT JOIN `constraint_to_group` 
     ON `constraint_to_group`.groupid=`user_to_group`.groupid 
    LEFT JOIN `constraint_to_user` 
     ON `constraint_to_user`.userid=`users`.id 
    LEFT JOIN `constraints` 
     ON (`constraints`.id=`constraint_to_group`.constraintid OR `constraints`.id=`constraint_to_user`.constraintid) 
WHERE `users`.id=1 
GROUP BY users.id 
+0

感谢您的回答,但它没有解决我的问题。我编辑了我的问题,所以我的问题更加清晰。 – IggY

0

想我会它拆分为2次联合在一起的查询。没有做太多的检查,像这样的东西: -

SELECT users.id, 
     users.name, 
     constraints.id as cons_id, 
     constraints.name as cons_name, 
     groups.id as group_id, 
     groups.name as group_name 
FROM users 
LEFT JOIN user_to_group ON user_to_group.userid = users.id 
LEFT JOIN groups ON groups.id = user_to_group.groupid 
LEFT JOIN constraint_to_group ON constraint_to_group.groupid = user_to_group.groupid 
LEFT JOIN constraints ON constraints.id = constraint_to_group.constraintid 
WHERE users.id=1 
UNION 
SELECT users.id, 
     users.name, 
     constraints.id as cons_id, 
     constraints.name as cons_name, 
     NULL as group_id, 
     NULL as group_name 
FROM users 
LEFT JOIN constraint_to_user ON constraint_to_user.userid = users.id 
LEFT JOIN constraints ON constraints.id = constraint_to_user.constraintid 
WHERE users.id=1