选择由两个依赖于外部查询的子选择排序的查询

时间:2014-06-11 14:32:39

标签: mysql sql subquery correlated-subquery

我有以下带有示例数据的SQL模式(简化)。

Table vote
+--+-------+------+
|id|user_id|points|
+--+-------+------+
| 1|      1|     3|
| 2|      1|     1|
| 3|      1|     0|
| 4|      2|     2|
| 5|      2|     2|
| 6|      2|     0|
| 7|      3|     2|
| 8|      3|     1|
| 9|      3|     2|
+--+-------+------+

我想要实现的是选择按总和点排序的user_id,按大多数3个点排序,并按大多数2个点排序。

这样的事情:

SELECT v.user_id, SUM(v.points) FROM vote v ORDER BY SUM(v.points) DESC, (Number of 3 points) DESC, (Number of 2 points) DESC GROUP BY v.user_id

我努力设置这两个子查询,因为我不知道如何跟踪当前user_id

因此,在上述数据的情况下,我想要以下结果:

+-------+------+
|user_id|points|
+-------+------+
|      3|     5|
|      1|     4|
|      2|     4|
+-------+------+

用户3是第一个,因为他总共有5分,用户1是第二名,因为他一次有3分(比用户2多一分)。

这可以通过SQL实现吗?

1 个答案:

答案 0 :(得分:1)

我相信你想要的是这样......你不应该做子查询,而只是检查点,设置一个变量并按该变量排序......我需要测试有更多样本数据,但它提供了所需的结果

SELECT 
  v.user_id, 
  SUM(v.points) as addedNum,
  if(
      v.points = 3, @a := 2, if(v.points = 2, @a := 1, @a := 0)
  ) as num_p_three_two
FROM vote v 
JOIN (select @a := 0, @b := 0) as temp
GROUP BY v.user_id
ORDER BY 
addedNum DESC,
num_p_three_two DESC;

SQL FIDDLE

一起玩

我也更改了您的查询顺序,因为group byorder by之前发生了:)