MySQL分组方式与左连接
我正在尝试做一个非常复杂的查询(至少对我来说非常复杂,而不是对你:)) 我有用户和评论表 SQL Fiddle: 如果我使用MySQL分组方式与左连接,mysql,group-by,left-join,group-concat,Mysql,Group By,Left Join,Group Concat,我正在尝试做一个非常复杂的查询(至少对我来说非常复杂,而不是对你:)) 我有用户和评论表 SQL Fiddle: 如果我使用 select user_id, status_id from comments where user_id in (2,3) 它返回许多重复的值 如果可能的话,我想得到什么 如果您多次看到status\u id=10hasuser\u id=2,3,4和2。 因此,我想从这里获得最新的用户id(唯一)的最大值,例如 现在它将是user\u id=4和2的主要复杂部分。现
select user_id, status_id from comments where user_id in (2,3)
它返回许多重复的值
如果可能的话,我想得到什么
如果您多次看到status\u id=10
hasuser\u id=2,3,4和2。
因此,我想从这里获得最新的用户id
(唯一)的最大值,例如
现在它将是user\u id=4和2
的主要复杂部分。现在,我想在一列中获取user_id=4和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);
(你的更新小提琴)
我们可以使用相关子查询来查找每个状态id
的max用户id
,其次是max用户id
。在这里,使用GROUP\u CONCAT
方法可能更可取,因为它还允许您轻松地将任意数量的用户作为CSV列表容纳
此外,如果您使用的是MySQL 8+或更高版本,那么我们可以利用排名分析功能,这也会更容易。我建议使用分组方式和分组方式,例如:
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
您使用的是什么版本的MySQL?谢谢您的快速回复。在运行mysql——版本14.14发行版5.7.21的mysql之后,对于osx10.13(x86_64),使用编辑行包装器
此数据集中没有用户4伟大的,它显示了结果,但如何从2,7
获取用户信息。有可能吗?只需在(2,7)中添加一个WHERE user_id,你能给我举个例子吗?非常感谢:)从(2,7)按状态分组的用户id所在的注释中选择状态id、组CONCAT(不同的(用户id)分隔符',')。但是,我们是否可以从用户表而不是ID返回用户详细信息?是的,我们可以。一种方法是将我的查询包装为子查询,然后将两个用户列(读:join tweep)中的每一个都连接到另一个表中,根据用户id
引入另一个值。如果你能用另一个表更新你的Fiddle,我可以在这里粘贴另一个演示链接。@sadek看看,它以我上面给出的查询为起点,输入每个用户的名字和姓氏。@sadek然后使用左连接将我的查询连接到用户表。您可以使用COALESCE
将NULL
替换为某个占位符值。或者,你可以保持原样。这个答案甚至更棒。:)你能为我介绍一些高级SQL学习的学习材料吗?非常感谢,很难说:)我喜欢阅读mysql上的性能博客,比如,我的大部分知识实际上来自阅读堆栈溢出和db堆栈交换。另外官方资源其实也挺不错的,比如或者谢谢你的帮助:)贴了一个问题。如果你有时间,请告诉我。非常感谢。
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