2011-05-08 32 views
1

我认为这是best solution。然而,这种查询是解决不了我的问题 - 我有一个像这样的表:mysql在群组之前排序

+--+-------+-----+ 
|id|user_id|score| 
+--+-------+-----+ 
|1 |1  |5 | 
+--+-------+-----+ 
|2 |1  |16 | 
+--+-------+-----+ 
|3 |1  |15 | 
+--+-------+-----+ 

查询:

SELECT * 
    FROM (`_scorboard`) 
GROUP BY `user_id` 
    HAVING `score` = MAX(score) 
ORDER BY `score` desc 

result 0 rows 

为什么它返回0的记录?

+1

这甚至执行? 'SELECT * ... GROUP BY ...'是一件很奇怪的事情! – 2011-05-08 23:04:54

+0

[这里](http://stackoverflow.com/questions/5140785/mysql-order-before-group-by/5140943#5140943),这样的解决方案是由 – alioygur 2011-05-08 23:10:04

+0

给出的,我这样解决它,但我不认为(t2.firstname,'',t2.lastname)AS全名 FROM(SELECT * FROM _scorboard ORDER BY score DESC)AS t1 LEFT JOIN _user_profile AS t2 ON(t1。 user_id = t2.user_id) GROUP BY t1.user_id LIMIT 0,20 – alioygur 2011-05-08 23:12:56

回答

3

用途:

SELECT a.* 
    FROM SCOREBOARD a 
    JOIN (SELECT t.user_id, 
       MAX(t.score) AS max_score 
      FROM SCOREBOARD t 
     GROUP BY t.user_id) b ON b.max_score = a.score 
          AND b.user_id = a.user_id 

如果你想那些谁得分最高的表:

SELECT a.* 
    FROM SCOREBOARD a 
    JOIN (SELECT MAX(t.score) AS max_score 
      FROM SCOREBOARD t) b ON b.max_score = a.score 
3

既然你通过1user_id在您的查询中,MySQL组一个GROUP BY条款首先,选择任何它喜欢的行。 HAVING子句将应用于这些选定的行。由于所选行可能是MAX的值为score的那一行,因此查询返回0结果。

做正确的方法是:

SELECT _scoreboard.* 
    FROM _scoreboard JOIN (SELECT user_id, MAX(score) 
          FROM _scorboard 
          GROUP BY user_id) 
     AS t ON _scoreboard.user_id = t.user_id 
      AND _scoreboard.score = t.score 
ORDER BY _scoreboard.score DESC 
+1

感谢您回答问题!这是我从中学到的东西! :) – 2012-03-06 09:23:34