使用表关系编写复杂的SQL查询

使用表关系编写复杂的SQL查询,sql,many-to-many,Sql,Many To Many,我将首先展示我的表结构(仅提及相关字段) 我想展示一个记分牌。列表中的第一个用户将是他完成的级别计数最高的用户。 对于上面的示例,USER1将显示在USER2的上方 我想接收下一个数据: user_id, user_name, user_registration_date, COUNT(level_id rows) AS score 对于我收到的每个SQL行,按分数计数排序。 例如: 我知道如何使用内部联接,但我认为计数和排序高于我当前的水平。请帮忙?试试这个: SELECT Users.us

我将首先展示我的表结构(仅提及相关字段)

我想展示一个记分牌。列表中的第一个用户将是他完成的级别计数最高的用户。 对于上面的示例,USER1将显示在USER2的上方

我想接收下一个数据:

user_id, user_name, user_registration_date, COUNT(level_id rows) AS score
对于我收到的每个SQL行,按分数计数排序。 例如:

我知道如何使用
内部联接
,但我认为计数和排序高于我当前的水平。请帮忙?

试试这个:

SELECT Users.user_id, user_name, user_registration_date, COUNT(level_id) AS score
FROM Users INNER JOIN Levels_Completed ON Users.user_id = Levels_Completed.user_id
GROUP BY Users.user_id, user_name, user_registration_date
SELECT
   U.user_id,
   U.user_name,
   U.user_registration_date,
   COUNT(L.level_id) as score
FROM Users U
   LEFT JOIN Levels_Completed L
       ON U.User_Id = L.User_Id
GROUP BY U.user_id, U.user_name, U.user_registration_date
ORDER BY score DESC

@T.J.Crowder感谢你纠正了Mechanks的回答。你能解释一下为什么在日期上使用
MIN
,在id和名称上使用
groupby
?groupby是为了告诉SQL哪些列需要被视为“相同”,因此它会在COUNT()、SUM()、MAX()等列上进行聚合。也就是说,它将所有按和分组的列(在该列表中的所有列中)聚合您请求的字段。关于
MIN
——在这种情况下,这是我的错误(现在我将更新我的答案),但想象一下,对于每一张记录,这是一个不同的日期,比如用户玩游戏的日期。您不希望SQL将不同的日期视为不同的分组,因此您只需选择一个(例如使用<代码> min < /代码>)
SELECT Users.user_id, user_name, user_registration_date, COUNT(level_id) AS score
FROM Users INNER JOIN Levels_Completed ON Users.user_id = Levels_Completed.user_id
GROUP BY Users.user_id, user_name, user_registration_date
SELECT
   U.user_id,
   U.user_name,
   U.user_registration_date,
   COUNT(L.level_id) as score
FROM Users U
   LEFT JOIN Levels_Completed L
       ON U.User_Id = L.User_Id
GROUP BY U.user_id, U.user_name, U.user_registration_date
ORDER BY score DESC
SELECT Users.user_id, user_name, user_registration_date, score
FROM Users
INNER JOIN (
  SELECT user_id, COUNT(level_id) AS score
  FROM Levels_Completed
  GROUP BY user_id)
USING (user_id)
ORDER BY score DESC