Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 使用分组依据时选择特定行_Mysql_Sql - Fatal编程技术网

Mysql 使用分组依据时选择特定行

Mysql 使用分组依据时选择特定行,mysql,sql,Mysql,Sql,我有下面的SQL表,它跟踪用户在特定时间点的分数。一个用户每天可以有多个分数 +-------+------------+-------+-----+ | user | date | score | ... | +-------+------------+-------+-----+ | bob | 2014-04-19 | 100 | ... | | mary | 2014-04-19 | 100 | ... | | alice | 2014-04-20 | 100

我有下面的SQL表,它跟踪用户在特定时间点的分数。一个用户每天可以有多个分数

+-------+------------+-------+-----+
| user  | date       | score | ... |
+-------+------------+-------+-----+
| bob   | 2014-04-19 | 100   | ... |
| mary  | 2014-04-19 | 100   | ... |
| alice | 2014-04-20 | 100   | ... |
| bob   | 2014-04-20 | 110   | ... |
| bob   | 2014-04-20 | 125   | ... |
| mary  | 2014-04-20 | 105   | ... |
| bob   | 2014-04-21 | 115   | ... |
+-------+------------+-------+-----+
给定一个特定的用户(比如说,
bob
),如何生成每个用户分数的报告,但只使用每天提交的最高分数?(获取分数最高的特定行也很重要,而不仅仅是最高分数)

是我构建的基础查询。它将生成以下结果集:

+-------+------------+-------+-----+
| user  | date       | score | ... |
+-------+------------+-------+-----+
| bob   | 2014-04-19 | 100   | ... |
| bob   | 2014-04-20 | 110   | ... |
| bob   | 2014-04-21 | 115   | ... |
+-------+------------+-------+-----+
2014-04-20
中,鲍勃的
125
高分缺失。我试着用
MAX(score)

返回当天的最高分数,但不返回分数最高的行。该行上的其他列值很重要

+-------+------------+-------+-----+------------+
| user  | date       | score | ... | max(score) |
+-------+------------+-------+-----+------------+
| bob   | 2014-04-19 | 100   | ... | 100        |
| bob   | 2014-04-20 | 110   | ... | 125        |
| bob   | 2014-04-21 | 115   | ... | 110        |
+-------+------------+-------+-----+------------+
最后,我试过了

SELECT *, MAX(score)  FROM `user_score` WHERE `user` = 'bob' AND score = MAX(score) GROUP BY `date`
但这会导致无效地使用
分组方式

  • 我的目标是正确的,但是我不知道具体的分数
编辑:


SQLFiddle:

如果您想要所有字段,MySQL中最简单(也是最快)的方法是使用
不存在

SELECT *
FROM `user_score` us
WHERE `user` = 'bob' AND
      NOT EXISTS (SELECT 1
                  FROM user_score us2
                  WHERE us2.`user` = us.`user` AND
                        us2.date = us.date AND
                        us2.score > us.score
                 );

这似乎是一种奇怪的方法。而且,我承认是的。它所做的非常简单:“从
user\u score
中获取Bob的所有行,其中没有更高的分数(Bob)”。这相当于获得得分最高的行。在
用户分数(姓名、分数)
上有一个索引,这可能是做你想做的事情的最有效的方法。

你可以使用
加入

SELECT a.*
FROM `user_score` as a
INNER JOIN (SELECT `user`, `date`, MAX(score) MaxScore
            FROM `user_score` 
            GROUP BY `user`, `date`) as b
    ON a.`user` = b.`user`
    AND a.`date` = b.`date`
    AND a.score = b.MaxScore
WHERE a.`user` = 'bob' 

一个选项是使用内联视图和联接操作。如果给定日期有多行具有“high score”值,则此查询将返回所有行。(如果
(用户、日期、分数)
是唯一的,则这不是问题。)

例如:

SELECT t.user
     , t.date
     , t.score
     , t.`...`
  FROM user_score t
  JOIN ( SELECT d.user
              , d.date
              , MAX(s.score) AS score
           FROM user_score d 
          WHERE d.user = 'bob'
          GROUP BY d.user, d.date
       ) s
    ON s.user  = t.user
   AND s.date  = t.date
   AND s.score = t.score

你有没有一个sql的小提琴为这个机会?没有,我简化了我的实际数据集的问题。我会把一把小提琴放在一起,用它编辑OP,可能是+1的副本,很好。(虽然您应该使用
user
更改
name
列,并添加
us2.date=us.date
)这很好,但它只返回最高的总分,不是每个人的day@johnluetke这是因为您需要将
us2.date=us.date
添加到condition@GordonLinoff我看过你对这类问题的回答,OP希望每组最多一行,等等,您对这些问题的回答大多基于使用exists方法,因此我想知道这种方法比join(也就是+1)更有效effort@Lamak . . . 我在想“名称比‘user’更好,因为我记不起
user
是否是保留字”。我说服了自己。我还确定了日期问题。
SELECT a.*
FROM `user_score` as a
INNER JOIN (SELECT `user`, `date`, MAX(score) MaxScore
            FROM `user_score` 
            GROUP BY `user`, `date`) as b
    ON a.`user` = b.`user`
    AND a.`date` = b.`date`
    AND a.score = b.MaxScore
WHERE a.`user` = 'bob' 
SELECT t.user
     , t.date
     , t.score
     , t.`...`
  FROM user_score t
  JOIN ( SELECT d.user
              , d.date
              , MAX(s.score) AS score
           FROM user_score d 
          WHERE d.user = 'bob'
          GROUP BY d.user, d.date
       ) s
    ON s.user  = t.user
   AND s.date  = t.date
   AND s.score = t.score