在mysql中选择父项,无论它是否有子项

在mysql中选择父项,无论它是否有子项,mysql,left-join,right-join,Mysql,Left Join,Right Join,我需要选择所有用户,无论他们是否有图像(如果有),然后选择主图像。这对你来说可能很简单,但对我来说很难 我有两张表,用户,图片 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

我需要选择所有用户,无论他们是否有图像(如果有),然后选择主图像。这对你来说可能很简单,但对我来说很难

我有两张表,用户,图片

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”来完成

下面的
左连接
右侧的子查询将
图像
表限制为每个用户只有那些具有最大
is_primary
值的记录。当用户没有主设备时,
的最大值为0,当用户有主设备时,最大值为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
此处演示:


下面的
左连接右侧的子查询将
图像
表限制为每个用户只有那些具有最大
is_primary
值的记录。当用户没有主设备时,
的最大值为0,当用户有主设备时,最大值为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
此处演示:

试试这个:

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
让我们添加一个最大值为的聚合。

尝试以下操作:

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

让我们添加一个最大值为..的聚合。

我们可以从此查询中删除重复@Tim@learner如果您没有提供这样做的逻辑,就不能这样做。为我们提供所需的规则,这些规则将过滤掉第二行。每个用户只能有一个主映像,因此,如果用户有主映像,则从数据库获取该映像;如果在mage表中找不到该用户的主映像或记录,则将其置为null。希望这样能有助于提出一些逻辑@timbut max每个用户都应该有一个图像记录,我们可以从这个查询中删除重复@Tim@learner如果您没有提供这样做的逻辑,就不能这样做。为我们提供所需的规则,这些规则将过滤掉第二行。每个用户只能有一个主映像,因此,如果用户有主映像,则从数据库获取该映像;如果在mage表中找不到该用户的主映像或记录,则将其置为null。希望这样能有助于提出一些逻辑@timbut max每个用户都应该有一个图像记录它有重复,是否可以删除它,如果existit有重复,我只需要选择一个主图像而不是全部,是否可以删除它,如果存在,我只需要选择一个主图像而不是全部