在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有重复,我只需要选择一个主图像而不是全部,是否可以删除它,如果存在,我只需要选择一个主图像而不是全部