mysql - 如何加入可选子表?
问题描述
我想从下表中选择数据。(AWS RDB,无服务器 Aurora MySQL)
表.1 用户
| id | name |
|----|---------|
| 1 | Alpha |
| 2 | Bravo |
| 3 | Charlie |
* id is PK.
表.2 头像
| id | user_id | image_path |
|----|---------|------------|
| 1 | 1 | 1.jpg |
| 2 | 2 | 2.jpg |
| 3 | 1 | 1-2.jpg |
* id is PK.
* user_id is FK user.id
- 用户可以选择上传头像图像。
- 用户不能删除头像。仅附加。
预计
- 如果存在头像,它将选择最大的id。
- 如果头像不存在,选择为NULL。
| user_id | user_name | avatar_id | avatar_image_path |
|---------|-----------|-----------|-------------------|
| 1 | Alpha | 3 | 1-2.jpg |
| 2 | Bravo | 2 | 2.jpg |
| 3 | Charlie | NULL | NULL |
现在,我写了这个 SQL。
SELECT
user.id AS user_id,
user.name AS user_name,
avatar.id AS avatar_id,
avatar.image_path AS avatar_image_path
FROM user
LEFT JOIN avatar ON avatar.user_id = user.id
GROUP BY user.id
HAVING MAX(avatar.id);
但是,user_id = 3
没有选择行。
输出
| user_id | user_name | avatar_id | avatar_image_path |
|---------|-----------|-----------|-------------------|
| 1 | Alpha | 3 | 1-2.jpg |
| 2 | Bravo | 2 | 2.jpg |
我应该怎么做?
解决方案
你可以试试下面的脚本 -
SELECT A.*,C.image_path
FROM user A
LEFT JOIN (
SELECT user_id,max(id) id
FROM avatar
GROUP BY user_id
) B ON A.id = B.user_id
LEFT JOIN avatar C ON B.id = C.id
推荐阅读
- sql - 如何显示最大数量的行?
- swift - 以编程方式创建 TableView 时不刷新
- xslt - XSLT 帮助 - 在 XSLT 中创建一个变量来存储交叉引用映射并基于该映射对输入元素进行分组
- delphi - Android 屏幕上的浮动应用程序
- firebase - firestore 查询不会返回 Flutter/dart 移动应用程序中的文档,但可以在 javascript 中使用
- sql - 我想从 Erlang 中的用户那里获取输入并将其添加到数据库中
- unity3d - 类型已经定义了具有相同参数类型的成员
- zxing - Zxing web 使用 base64 填充对 Aztec 代码进行解码,但 3.4.0 jar 没有找到条码
- c++ - 为什么这个重载运算符给出错误的输出?
- python - 如何确定 Keras 分类器模型中的预测类别?