Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按多列ASC和DESC排序_Mysql_Sql Order By_Multiple Columns - Fatal编程技术网

MySQL按多列ASC和DESC排序

MySQL按多列ASC和DESC排序,mysql,sql-order-by,multiple-columns,Mysql,Sql Order By,Multiple Columns,我有两个MYSQL表,用户和分数。详情: 用户表: 分数表: 我的目的是获得20个具有点的用户列表字段排序描述(降序)并平均时间字段排序ASC(升序)。我使用以下查询: SELECT users.username, scores.point, scores.avg_time FROM scores, users WHERE scores.user_id = users.id GROUP BY users.username ORDER BY scores.point DESC, sco

我有两个MYSQL表,用户分数。详情:

  • 用户表:

  • 分数表:

我的目的是获得20个具有点的用户列表字段排序描述(降序)并平均时间字段排序ASC(升序)。我使用以下查询:

SELECT users.username, scores.point, scores.avg_time
FROM scores, users
WHERE scores.user_id = users.id
GROUP BY users.username
ORDER BY scores.point DESC, scores.avg_time
LIMIT 0, 20
结果是:

username    point    avg_time
demo123      100        60
demo123456   100       100
demo         90        120

结果是错误的,因为第一行正好是point=100,avg_time=60

我期望的结果是:

username    point    avg_time
demo123      100        60
demo123456   100       100
demo         90        120
我尝试了很多次不同的查询,但结果仍然是错误的。你能给我一些解决办法吗


提前谢谢

我想你不明白表的关系

用户:分数=1:*

只是加入并不是一个解决方案

这是你的意图吗

SELECT users.username, avg(scores.point), avg(scores.avg_time)
FROM scores, users
WHERE scores.user_id = users.id
GROUP BY users.username
ORDER BY avg(scores.point) DESC, avg(scores.avg_time)
LIMIT 0, 20
(此查询通过描述点、asc获取每个用户的平均点和平均平均平均时间)平均平均时间

如果你想得到每个分数的排名?使用左外连接

SELECT users.username, scores.point, scores.avg_time
FROM scores left outer join users on scores.user_id = users.id
ORDER BY scores.point DESC, scores.avg_time
LIMIT 0, 20

默认情况下,按主键id分组,因此结果
用户名点平均时间
demo123 100 90--->id=4
demo123456 100-->id=7

演示90 120-->id=1

好的,我想我现在明白你想要什么了,在查询之前让我澄清一下以确认。您希望每个用户有一条记录。对于每个用户,您都需要他们的最佳分数记录。在每个用户的最佳积分中,您希望获得平均时间最佳的积分。一旦你有了所有用户的“最佳”值,你想要的最终结果排序与最佳点第一。。。几乎就像一场比赛的排名

现在是查询。如果上面的陈述是准确的,那么您需要从获得每个人的最佳点/平均时间开始,并为该条目分配一个“排名”。使用MySQL@variables很容易做到这一点。然后,只需包含一个HAVING子句,只保留每个人排名第一的记录。最后应用最佳点和最短平均时间的顺序

select
      U.UserName,
      PreSortedPerUser.Point,
      PreSortedPerUser.Avg_Time,
      @UserRank := if( @lastUserID = PreSortedPerUser.User_ID, @UserRank +1, 1 ) FinalRank,
      @lastUserID := PreSortedPerUser.User_ID
   from
      ( select
              S.user_id,
              S.point,
              S.avg_time
           from
              Scores S
           order by
              S.user_id,
              S.point DESC,
              S.Avg_Time ) PreSortedPerUser
         JOIN Users U
            on PreSortedPerUser.user_ID = U.ID,
      ( select @lastUserID := 0,
               @UserRank := 0 ) sqlvars 
   having
      FinalRank = 1
   order by
      Point Desc,
      Avg_Time

注意,由于获得答案需要内联@variables,因此每行末尾都有两个额外的列。这些只是“遗留下来的”,在您试图进行的任何实际输出演示中都可以忽略。。。或者,您可以将整个内容包装到一个更高的级别上,只获得您想要的几个列

select 
      PQ.UserName,
      PQ.Point,
      PQ.Avg_Time
   from
      ( entire query above pasted here ) as PQ

@德拉普是个天才。我一直不明白他是如何编写SQL的,所以我试着用我自己的理解来编写它


    SELECT 
      f.username,
      f.point,
      f.avg_time
    FROM
      (
      SELECT
        userscores.username,
        userscores.point,
        userscores.avg_time
      FROM
        (
        SELECT
          users.username,
          scores.point,
          scores.avg_time
        FROM
          scores
        JOIN users
        ON scores.user_id = users.id
        ORDER BY scores.point DESC
        ) userscores
      ORDER BY
        point DESC,
        avg_time
      ) f
    GROUP BY f.username
    ORDER BY point DESC

它通过使用GROUP by而不是user@variables产生相同的结果。

请使用explicit
JOIN
语法重新编写。@namxee:我了解表关系,但我不明白为什么在查询中使用avg()函数。你能解释一下吗?@Tan越南:分数表中有多条相同用户id的记录。如果你把这两个表连接起来。用户id不是唯一的记录。不管怎么说,我以为你想得到每个用户的平均点和平均时间。我听说了Miss Understand。我想她是私人的朋友Parts@namxee:谢谢!我不想让每个用户都知道“平均时间”和“点”列的平均值。我只希望“point”字段对DESC(降序)进行排序,并将“avg_time”字段sort ASC(升序)组合起来。正如namxee所暗示的,每个用户有多行。您想让每个用户平均“平均时间”和“点”列吗?并使用该结果作为排序标准?如果没有,请显示您期望的示例结果。@DRapp:我不希望每个用户平均显示“平均时间”和“点”列。我只希望“点”字段对DESC(降序)进行排序,并将“平均时间”字段sort ASC(升序)合并。我已经编辑了我想要的结果。对不起,我的英语不好。可能是重复的事实上你是非常聪明的开发人员。我很难解释我的意图,因为我的英语词汇很少。这就是我需要的答案。感谢您在回答中清楚地解释!:)@Tan越南非常乐意提供帮助,并将此作为未来的一点指导。有样本数据和你想要的是一个很大的帮助。此外,在获得最终成绩(在本例中)之前,请清楚我想要的基本信息,即每个人的最佳成绩。至于你的英语,你做得很好。你已经把你的想法和解决方案讲清楚了,所以别担心。