如何将mysql左join和groupby组合到另一个表中

v6ylcynt  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(312)

我使用的是mysql,有两个表user和result。

`user`                                 `result`
---------------------------          -------------------------------------
| `id`  | `name` |`active`|          | `id` |`user_id` |`status`|`identity`|
--------------------------            ------------------------------------
|   1   | Apia   | 1    |            |   1   |    1   |    2   |    1   |
|   2   | Tang   | 1    |            |   2   |    1   |    2   |    1   |
|   3   | Jemrom | 1    |            |   3   |    2   |    1   |    1   |
|   4   | Akwet  | 1    |            |   4   |    5   |    3   |    1   |
|   5   | Lamte  | 1    |            -------------------------------------
---------------------------

所以结果应该是这样的:

------------------------------
| `name` |`active` |`status`  |
------------------------------
| Apia   |    1    |`passed`  |
| Tang   |    1    |`passed`  |
| Akwet  |    1    |`awaiting`|
| Lamte  |    1    |`failed`  |
| Jerome  |    1    |`unavailable`  |
------------------------------

到目前为止,我已经:

SELECT     u.*, 
           r.status
FROM       user u 
LEFT JOIN result r 
ON         r.user_id = u.id 
WHERE u.active = 1;

但是我不知道如何为结果表方面编写查询。
注意:对于结果表中的状态(1=等待,2=通过,3=失败)
我想使用left join从user表中选择所有内容,其中active=1(按名称排序),并与identity=1的结果表中的相关user\u id匹配。结果表必须按用户id分组。如果用户在结果中没有数据,则应显示不可用状态,而不是null。
如何在mysql中编写这个查询?
谢谢

but5z9lq

but5z9lq1#

你好像想要一个 left join 和聚合。您的问题不清楚当一个用户有多个结果时,您希望如何计算状态,因此我假设您希望获得最大值:

select
    u.name,
    u.active,
    case max(r.status)
        when 1 then 'awaiting'
        when 2 then 'passed'
        when 3 then 'failed'
        else 'unavailable'
    end as status
from users u
left join result r on r.user_id = u.id and r.identity = 1
where u.active = 1
group by u.id, u.name, u.active

请注意 user 是mysql(以及大多数其他数据库)中的语言关键字,因此表名的选择很差。我把它改名为 users 在查询中。

相关问题