【问题标题】:MYSQL Limit 1 Record per in Joined TableMYSQL 限制每个连接表中的 1 条记录
【发布时间】:2023-01-15 10:56:06
【问题描述】:

正在尝试连接 user_id 上的两个表。 users 表对每个用户都有唯一的 iduser_codes 表可以有多行具有相同的user_id。我只想从连接的 user_codes 表中返回 1 行,其中 code_count 是最大的。

用户表

| id       | email           |
| -------- | --------------- |
| 1        | user1@gmail.com |
| 2        | user2@gmail.com |
| 3        | user3@gmail.com |

用户代码表

| user_id  | invite_code | count |
| -------- | ----------- | ------|
| 1        | X49MCL1     | 40    |
| 1        | K59CLT9     | 1000  |
| 2        | X5BC924     | 15    | 
| 2        | 38DF80L     | 8     |
| 3        | 641020T     | 22    |

预期结果

| id  |  email          | invite_code | count | 
| --- | --------------- | ----------- | ------|
| 1   | user1@gmail.com | K59CLT9     | 1000  |
| 2   | user2@gmail.com | X5BC924     | 15    |
| 3   | user3@gmail.com | 641020T     | 22    | 

query result 仅包含在 user_codes 表中找到的具有最高 count 的每个用户的单个实例。

这是我能得到的最接近的查询,但它只为第一个用户返回 invite_codecount

SELECT a.id, a.email, b.invite_code, b.count
FROM users a
LEFT JOIN user_codes b
ON b.user_id = a.id 
AND b.count = (SELECT MAX(count) FROM user_codes GROUP BY b.user_id)

上面的查询返回结果:

| id  |  email          | invite_code | count  | 
| --- | --------------- | ----------- | ------ |
| 1   | user1@gmail.com | K59CLT9     | 1000   |
| 2   | user2@gmail.com | `NULL`      | `NULL` |
| 3   | user3@gmail.com | `NULL`      | `NULL` | 

我似乎无法弄清楚第一个记录之后的记录如何/为什么不包括 invite_codecount

感谢帮助!

【问题讨论】:

    标签: mysql join


    【解决方案1】:

    在 MySQL 8+ 上,我建议使用 RANK() 窗口函数:

    WITH cte AS (
        SELECT u.id, u.email, uc.invite_code, uc.count,
               RANK() OVER (PARTITION BY u.id ORDER BY uc.count DESC) rnk
        FROM users u
        INNER JOIN user_code uc
            ON uc.user_id = u.id
    )
    
    SELECT id, email, invite_code, count
    FROM cte
    WHERE rnk = 1;
    

    RANK() 函数还将匹配每个用户的多个记录,并与最高计数相关联。

    您可以通过将子查询内的用户与外部查询相关联来挽救当前的尝试:

    SELECT a.id, a.email, b.invite_code, b.count
    FROM users a
    LEFT JOIN user_codes b
        ON b.user_id = a.id AND
           b.count = (SELECT MAX(uc.count) FROM user_codes uc WHERE uc.user_id = a.id);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2013-07-23
      相关资源
      最近更新 更多