2016-11-25 38 views
1

我需要選擇所有用戶是否有圖像如果他們有,然後選擇主要圖像。這對你來說可能很簡單,但對我來說很難。選擇家長是否有孩子或不在mysql

我有2代表的用戶,圖像

Users Table 

Id | name | 
1 xyz  
2 abc 
3 qwe 
4 rty 

Images Table 

Id | user_id | image_path | is_primary 
1  1   path   0 
2  1   path   1 
3  2   path   1 
4  4   path   0 



**Result I'm expecting** 

name | image_path | is_primary 
xyz | path  | 1 
abc | path  | 1 
qwe | null  | 0   (this user has no image in images table) 
rty | path  | 0 

我不知道該怎麼做。看起來很複雜,因爲我知道只有「AND」,「Having」或「sub query」才能做到這一點。

回答

0

右側的子查詢LEFT JOINImages表限制爲僅對於每個用戶具有最大is_primary值的記錄。當用戶沒有主,爲is_primary最高值爲零,而當他確實有一個小學,最大值爲1

SELECT t1.name, 
     t2.image_path, 
     COALESCE(t2.is_primary, 0) AS is_primary 
FROM Users t1 
LEFT JOIN 
(
    SELECT t1.user_id, 
      t1.image_path, 
      t1.is_primary 
    FROM Images t1 
    INNER JOIN 
    (
     SELECT user_id, MAX(is_primary) AS is_primary 
     FROM Images 
     GROUP BY user_id 
    ) t2 
    ON t1.user_id = t2.user_id AND 
     t1.is_primary = t2.is_primary 
) t2 
    ON t1.Id = t2.user_id 

演示在這裏:

SQLFiddle

+0

我們可以從這個查詢中刪除重複嗎? @Tim – learner

+0

@learner不是沒有你提供邏輯來做到這一點。給我們你想要的規則,它會過濾出第二行。 –

+0

每個用戶只能有一個主圖像,因此如果用戶擁有主圖像,則從數據庫獲取該圖像,或者如果在mage表中沒有找到該用戶的主圖像或沒有任何記錄,則將該圖像置爲null。希望所以這將有助於放置一些邏輯。 @tim – learner

0

試試這個:

SELECT 
    users.name, Images.image_path, IF(MAX(Images.is_primary)=1, 1, 0) 
FROM 
    users 
LEFT JOIN 
    Images 
ON 
    Images.user_id = users.Id 
GROUP BY 
    users.Id 

讓我們添加一個聚集與MAX ...

+0

它有重複,是否有可能將其刪除,我需要選擇只有1個主要圖像不是所有如果存在 – learner

+0

編輯我的答案 – barudo