MySQL分组与左联接

时间:2018-08-08 14:59:20

标签: mysql group-by left-join group-concat

我正在尝试做一个非常复杂的查询(至少对我而言不是(对您而言)非常复杂:))

我有用户和评论表。

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

如何实现如此复杂的东西。 目前,我必须使用应用程序逻辑来做到这一点。

谢谢您的时间。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我认为这可能是您真正想要的:

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);

enter image description here

Demo

(您的更新小提琴)

我们可以使用相关子查询为每个user_id查找最大user_id和第二至最大status_id,然后将它们分别旋转为两个单独的列。在这里最好使用GROUP_CONCAT方法,因为它还使您可以轻松地将任意数量的用户容纳为CSV列表。

此外,如果您使用的是MySQL 8+或更高版本,那么我们可以利用排名分析功能,这也将更加容易。

答案 2 :(得分:1)

我建议使用GROUP BYGROUP_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