MySQL 左连接分组
MySQL group by with left join
我正在尝试做一个非常复杂的查询(至少对我来说非常复杂,对你来说不是 :))
我有用户和评论 table。
SQL Fiddle: 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)
它returns 有很多重复值。
如果可能我想得到什么
如果您看到 status_id = 10
有 user_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
我怎么能实现这么复杂的东西。
目前我必须使用应用程序逻辑来完成它。
感谢您的宝贵时间。
select status_id, GROUP_CONCAT(distinct(user_id) SEPARATOR ',')
from comments
group by status_id
我想这可能就是您真正想要的:
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);
Demo
(你的更新Fiddle)
我们可以使用相关子查询为每个 status_id
找到最大值 user_id
和倒数第二个 user_id
,然后将它们分成两个单独的列。在这里使用 GROUP_CONCAT
方法可能更可取,因为它还可以让您轻松地将任意数量的用户容纳为 CSV 列表。
此外,如果您使用的是 MySQL 8+ 或更高版本,那么我们可以利用排名分析函数,这也会更容易。
我建议使用 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
我正在尝试做一个非常复杂的查询(至少对我来说非常复杂,对你来说不是 :))
我有用户和评论 table。
SQL Fiddle: 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)
它returns 有很多重复值。
如果可能我想得到什么
如果您看到 status_id = 10
有 user_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
我怎么能实现这么复杂的东西。 目前我必须使用应用程序逻辑来完成它。
感谢您的宝贵时间。
select status_id, GROUP_CONCAT(distinct(user_id) SEPARATOR ',')
from comments
group by status_id
我想这可能就是您真正想要的:
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);
Demo
(你的更新Fiddle)
我们可以使用相关子查询为每个 status_id
找到最大值 user_id
和倒数第二个 user_id
,然后将它们分成两个单独的列。在这里使用 GROUP_CONCAT
方法可能更可取,因为它还可以让您轻松地将任意数量的用户容纳为 CSV 列表。
此外,如果您使用的是 MySQL 8+ 或更高版本,那么我们可以利用排名分析函数,这也会更容易。
我建议使用 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