2015-11-03 65 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