mysql group by with left join左连接

mkh04yzy  于 2021-06-23  发布在  Mysql
关注(0)|答案(3)|浏览(379)

我正在尝试做一个非常复杂的查询(至少对我来说非常复杂,而不是对你:))
我有用户和评论表。
sql小提琴:http://sqlfiddle.com/#!9/b1f845/2号

select user_id, status_id from comments where user_id in (2,3);
+---------+-----------+
| user_id | status_id |
+---------+-----------+
|       2 |        10 |
|       2 |        10 |
|       2 |        10 |
|       2 |         7 |
|       2 |         7 |
|       2 |        10 |
|       3 |         9 |
|       2 |         9 |
|       2 |         6 |
+---------+-----------+

如果我使用

select user_id, status_id from comments where user_id in (2,3)

它返回许多重复的值。
如果可能的话我想得到什么。
如果你看到 status_id = 10user_id= 2,3 and 4 and 2 multiple times. 所以我想从这里得到最新的 user_id (独特的)例如,
会的 user_id = 4 and 2 现在是主要的复杂部分。我现在想得到用户的信息 user_id= 4 and 2 在一个专栏里,最后我可以得到这样的东西

status_id |  userOneUserName | userTwoUserName
 10            sadek4             iamsadek2
 ---------------------------------------------
 7        |    iamsadek2     |      null
 ---------------------------------------------
 9 .      |    iamsadek2     |      sadek2
 ---------------------------------------------
 6        |    iamsadek2     |       null

我怎么能做到这么复杂的事情。目前,我必须使用应用程序逻辑。
谢谢你抽出时间。

2mbi3lxu

2mbi3lxu1#

我想这可能就是你想要的:

SELECT DISTINCT
    status_id,
    (SELECT MAX(user_id) FROM comments c2 WHERE c1.status_id = c2.status_id) user_1,
    (SELECT user_id FROM comments c2 WHERE c1.status_id = c2.status_id
     ORDER BY user_id LIMIT 1 OFFSET 1) user_2
FROM comments c1
WHERE user_id IN (2,3);

演示

(你的小提琴)
我们可以使用相关子查询来查找最大 user_id 仅次于麦克斯 user_id 对于每个 status_id ,然后将每个列旋转为两个独立的列。使用 GROUP_CONCAT 这种方法在这里可能更可取,因为它还允许您轻松地将任意数量的用户作为csv列表来容纳。
另外,如果您使用的是mysql 8+或更高版本,那么我们可以利用秩分析函数,这也会更容易。

olmpazwi

olmpazwi2#

select status_id, GROUP_CONCAT(distinct(user_id) SEPARATOR ',')
from comments
group by status_id
46scxncf

46scxncf3#

我建议使用 GROUP BY 以及 GROUP_CONCAT ,例如:

SELECT status_id, GROUP_CONCAT(userName) AS users, GROUP_CONCAT(DISTINCT c.user_id) AS user_ids 
FROM (
  SELECT DISTINCT status_id, user_id FROM comments WHERE user_id in (2,3)
) c
JOIN users u ON (c.user_id = u.id)
GROUP BY status_id
ORDER BY status_id DESC

相关问题