2016-11-25 39 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