Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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
Php SQL集团;按两列排序_Php_Sql_Database_Group By_Sql Order By - Fatal编程技术网

Php SQL集团;按两列排序

Php SQL集团;按两列排序,php,sql,database,group-by,sql-order-by,Php,Sql,Database,Group By,Sql Order By,可能重复: 更新:我找到了我的解决方案,我已经发布了。谢谢大家的帮助 我正在开发一个需要排行榜的Facebook应用程序。记录完成游戏所需的分数和时间,并首先按分数进行组织,如果两个分数相同,则使用时间。如果用户已经玩了多次,则使用他们的最佳分数 分数越低,比赛的表现就越好 我的表格结构是: id facebook_id - (Unique Identifier for the user) name email score time - (time to complete game in s

可能重复:

更新:我找到了我的解决方案,我已经发布了。谢谢大家的帮助


我正在开发一个需要排行榜的Facebook应用程序。记录完成游戏所需的分数和时间,并首先按分数进行组织,如果两个分数相同,则使用时间。如果用户已经玩了多次,则使用他们的最佳分数

分数越低,比赛的表现就越好

我的表格结构是:

id
facebook_id - (Unique Identifier for the user)
name
email
score
time - (time to complete game in seconds)
timestamp - (unix timestamp of entry)
date - (readable format of timestamp)
ip
我认为可行的问题是:

SELECT *
FROM entries
ORDER BY score ASC, time ASC
GROUP BY facebook_id
我遇到的问题是,在某些情况下,它会拉入用户在数据库中的第一个分数,而不是他们的最高分数。我认为这取决于集团的声明。我本以为ORDER BY语句会解决这个问题,但显然不是

例如:

----------------------------------------------------------------------------
|  ID  |       NAME       |  SCORE  |  TIME  |  TIMESTAMP  |  DATE  |  IP  |
----------------------------------------------------------------------------
|  1   |  Joe Bloggs      |  65     |   300  | 1234567890  |  XXX   |  XXX |
----------------------------------------------------------------------------
|  2   |  Jane Doe        |  72     |   280  | 1234567890  |  XXX   |  XXX |
----------------------------------------------------------------------------
|  3   |  Joe Bloggs      |  55     |   285  | 1234567890  |  XXX   |  XXX |
----------------------------------------------------------------------------
|  4   |  Jane Doe        |  78     |   320  | 1234567890  |  XXX   |  XXX |
----------------------------------------------------------------------------
当我使用上面的查询时,我得到以下结果:

 1. Joe Bloggs - 65 - 300 - (Joes First Entry, not his best entry) 
 2. Jane Doe - 72 - 280
我本以为

 1. Joe Bloggs - 55 - 285 - (Joe's best entry)
 2. Jane Doe - 72 - 280 
这就像Group By忽略了顺序,只是覆盖了值

在GROUPBY中使用MIN(分数)选择最低的分数,这是正确的-但是它合并了数据库中用户第一条记录的时间,因此经常返回错误的时间

那么,我如何选择一个用户的最高分数和相关的时间、姓名等,然后按分数和时间排序结果呢


提前谢谢

如果你想要他们的最佳状态,你可以使用MIN()函数——你说过分数越低,他们做得越好

SELECT facebook_id, MIN(score), time, name, ... 
FROM entries 
GROUP BY facebook_id, time, name, ...
ORDER BY score, time

您的查询实际上没有意义,因为order by应该在group by之后。您使用的是什么SQL引擎?大多数人会给出一个错误

我认为你想要的更像:

select e.facebookid, minscore, min(e.time) as mintime -- or do you want maxtime?
from entries e join
     (select e.facebookid, min(score) as minscore
      from entries e
      group by facebookid
     ) esum
     on e.facebookid = esum.facebookid and
        e.score = e.minscore
group by e.facebookid, minscore

您也可以使用窗口函数来完成此操作,但这取决于您的数据库。

您需要最小化分数

    SELECT
      facebook_id,
      name,
      email,
      min(score) as high_score
    FROM
      entries
    GROUP BY
      facebook_id,
      name,
      email
   ORDER BY
     min(score) ASC
使用此选项:

这是:

SELECT name, min( `score` ) , min( `time` )
FROM `entries`
GROUP BY `name`
ORDER BY `score`, `time`
我明白了:


一种方法是:

SELECT entries.facebook_id, MIN(entries.score) AS score, MIN(entries.time) AS time
FROM entries
    INNER JOIN (
        SELECT facebook_id, MIN(score) AS score
        FROM entries
        GROUP BY facebook_id) highscores
    ON highscores.facebook_id = entries.facebook_id
    AND entries.score = highscores.score
GROUP BY entries.facebook_id
ORDER BY MIN(entries.score) ASC, MIN(entries.time) ASC
如果您需要entries表中的更多信息,那么您可以将其用作子查询,并再次加入显示的信息(facebook_id、分数、时间)以获得每个用户一行

你需要聚合两次,这是关键;一次查找用户的最低分数,另一次查找该用户的最低时间和分数。您可以颠倒聚合的顺序,但我希望这将以最快的速度进行过滤,从而提高效率


您可能还想检查第二次聚合时哪个更快:使用最低分数或使用分数分组。

谢谢您的帮助@彭加特得到了最接近的答案。。这是我对可能有同样问题的人的最后一个问题

SELECT f.facebook_id, f.name, f.score, f.time FROM
    (SELECT facebook_id, name, min(score)
    AS highscore FROM golf_entries
    WHERE time > 0
    GROUP BY facebook_id)
AS x
INNER JOIN golf_entries as f
ON f.facebook_id = x.facebook_id
AND f.score = x.highscore
ORDER BY score ASC, time ASC

再次感谢

其中
状况严重缺失。使用分组依据时,引擎有权从分组项中选择任何列,即使是每列的不同行。
ORDER BY
位于
GROUP BY
之后。使用多列
UNIQUE
索引。请提供示例数据和所需输出。@RedFilter-更新问题以包含一些示例数据。T恤伙计-我不确定在这种情况下,一个独特的索引会做什么。Teran-不幸的是,当我尝试此操作时,GROUPBY语句第一次在数据库中合并到返回的行中-因此它没有返回正确的数据。谢谢。但这并不是我想要的——这会按顺序输出所有参赛者的所有分数。我只想要每个用户的最高分数和与之相关的时间。我一整天都在和它斗争。。我肯定我遗漏了一些非常简单的东西。如果一个用户有两个相同的分数,但使用不同的时间-时间越长越好还是越短越好?嗨@Adnan Shammout-谢谢。这很好,除了我还需要按时间进行排序作为第二次排序外,Group by函数意味着特定用户在数据库中的第一次在该行中使用,不一定是正确的时间。Hi@Adnan-如果将第1行中的时间更改为200,则会将其作为结果第一行中的时间,这是不正确的。我现在找到了解决方案,并添加了我的答案。再次感谢Phil-我今天已经尝试了这个和一些变体。不幸的是,它返回用户输入的每个条目-它没有为每个用户选择单个最高分数。请从组中删除ID和时间,然后选择。对于最初的回答我很抱歉,对不起,我上面的陈述不正确-Order By在group By之后。我来试试这个。