在不减少结果数量的情况下检索不同的值

时间:2015-05-21 10:20:05

标签: mysql limit distinct

我正在编写一个MySQL请求,用于从问题列表中检索数据。 该表如下所示:

-----------------------------------------------------
| id | answer_name | rating | question_id | answers |
-----------------------------------------------------

多行可以具有相同的answer_name值,因为可以询问有关同一答案的几个问题。

现在,为了检索数据,我使用LIMIT子句,该子句是根据评级和总行数计算的。 例如,如果我想获得80%和100%评级之间的数据,并且有100行,我会使用ORDER BY评级LIMIT 80,20。

我的问题如下:我需要检索具有answer_name列的不同值的数据,但是使用GROUP BY子句会使结果数(例如表中的行数)减少聚合的原因,从而导致行的最高百分比没有返回任何导致在不存在的限制下搜索行的原因。

是否有人知道是否有办法保持结果数量相同,仍然可以检索answer_name列的不同结果?

编辑:

以下是一些示例行和预期输出:

game_data表:

 -----------------------------------------------------
 | id | answer_name | rating | question_id | answers |
 |----|-------------|--------|-------------|---------|
 |  1 | A. Merkel   |  40    |  1          | [1,2,3] |
 |  2 | A. Merkel   |  45    |  2          | [2,3,4] |
 |  3 | B. Clinton  |  55    |  1          | [2,5,8] |
 |  4 | B. Clinton  |  50    |  2          | [3,5,8] |
 |  5 | L. Messi    |  17    |  4          | [7,8,9] |
 |  6 | L. Messi    |  18    |  5          | [7,8,9] |
 |  7 | L. Messi    |  25    |  6          | [7,8,9] |
 |  8 | D. Beckham  |  21    |  4          | [6,7,8] |
 |  9 | D. Beckham  |  52    |  5          | [6,7,8] |
 | 10 | D. Beckham  |  41    |  6          | [6,7,8] |
 -----------------------------------------------------

其中答案是指向另一个表的ID数组。

假设我想要检索表格的50%到80%,按评级排序。

SELECT id FROM game_data GROUP BY answer_name ORDER BY rating LIMIT 5, 3

这里的问题是GROUP BY的answer_name会减少表的行数,因此不会返回3个结果,而是返回一个空集。

此外,我希望随机选择GROUP BY中的选定值。

2 个答案:

答案 0 :(得分:0)

像这样使用group by几乎与所有本能相反,但是你说你想要随机值,所以它已经足够好了。

select * from (
  select q.*, @rank := @rank + 1 as rank 
    from (
      select * from game_data
        group by answer_name
        order by rating desc
    ) q, (select @rank := 0) qq
  ) qqq
  where rank between (@rank * .5) and (@rank * .8)

demo here

它是如何工作的?首先(在最里面的查询中)我们将您的answer_name分组,以获得您的不同结果,然后我们按照要求对其进行排序。

然后在围绕那个的查询中,我们给这些结果排序从1到结果中的许多行。一旦此级别的查询完成,我们就知道我们的最佳答案是回答1,以及我们最差的问题'答案是我们@rank变量的最后一个值。

然后我们到达最外面的查询。我们可以使用@rank变量来确定我们用于过滤where子句的百分比。

每次运行相同的查询时,这都会给你相同的结果,但所选的值是不确定的 - 所以它可能会改变。如果你想要真正随机(即每次执行的变化),那就完全不同了。

(注意,这一位:, (select @rank := 0) qq纯粹是为了初始化变量)

答案 1 :(得分:0)

简单就是那个。

使用Group By' id'不是' answer_name' b / c Group By未获取重复值

SELECT * FROM game_data GROUP BY id ORDER BY rating