我在MySQL中有以下表格:
表分数:
id integer
score integer
scoredate date
复合(id,scoredate)是唯一的
id score scoredate
--+----+------
1 | 2 | 2015-01-01
1 | 2 | 2015-01-02
1 | 3 | 2015-01-03
1 | 2 | 2015-01-04
2 | 3 | 2015-01-01
2 | 3 | 2015-01-02
2 | 3 | 2015-01-03
2 | 3 | 2015-01-04
3 | 1 | 2015-01-01
3 | 1 | 2015-01-02
3 | 1 | 2015-01-03
3 | 1 | 2015-01-04
4 | 3 | 2015-01-01
4 | 3 | 2015-01-02
4 | 3 | 2015-01-03
4 | 1 | 2015-01-04
我想识别其分数至少改变一次的'ids'。
id score
--+----
1 | 2
1 | 3
4 | 3
4 | 1
我能够使用复杂的子查询来做到这一点,但我想知道是否有办法使用更简单的查询来完成它。
例如,使用以下查询我得到了我们关心的id。我可以做另一个子查询或加入此输出以获得上面的结果,但我希望构建一个更简单的查询。以下已经有效地进行了2次传递(2次查询)并进行了另一次连接或子查询,这意味着要由引擎处理的第3次传递或查询:
SELECT `id` FROM (SELECT `id`, `score` FROM `scores` GROUP BY `id`, `score`) AS sq GROUP BY `id` HAVING count(1) > 1
我希望在1-2次通过/查询中得到结果。
答案 0 :(得分:1)
SELECT distinct id, score
FROM Scores
where id in (select id from Scores group by id having count(distinct score) > 1);
这会给你想要的结果。
答案 1 :(得分:0)
SELECT DISTINCT x.*
FROM my_table x
JOIN my_table y
ON y.id = x.id
AND y.date > x.date
AND y.score <> x.score;