MySQL分组方式与左连接

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的主要复杂部分。现

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

我有用户和评论表

SQL Fiddle:

如果我使用

select user_id, status_id from comments where user_id in (2,3)
它返回许多重复的值

如果可能的话,我想得到什么

如果您多次看到
status\u id=10
has
user\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