MySQL 排名查询任务

3

我想要一个像这样的表格

显示我们拥有的书籍,按它们的页数排名。我们想使用50页范围来排列页数。这意味着任何具有500-549页的书籍具有相同的排名;页数在550-599之间的书籍具有相同的排名;页数在600-649之间的书籍具有相同的排名;页数在650-699之间的书籍具有相同的排名,以此类推。在示例显示中,我们有四本书都在第三名。请注意,我们不会跳过排名数字-请查看前两个示例行。不要对最大页数值做出任何假设。在设计查询逻辑时,请勿使用表格中的当前数据来决定逻辑。

+---------+------------+------+
| Book_ID | Page_count | Rank |
+---------+------------+------+
| 1001 | 2000 | 1 |
| 1587 | 1300 | 2 |
| 8546 | 982 | 3 |
| 8415 | 980 | 3 |
| 1474 | 976 | 3 |
| 1444 | 970 | 3 |
| 1524 | 918 | 4 |
| 2005 | 894 | 5 |
| 200 | 879 | 5 |
| 201 | 850 | 5 |
| 4574 | 825 | 6 |
| 6584 | 825 | 6 |

现在我有了编辑:

SELECT b.book_id AS Book_ID, b.page_count as Page_Count, (
SELECT COUNT(DISTINCT page_count)
FROM a_bkinfo.books as b2
WHERE b2.page_count >= b.page_count
) as Rank
FROM a_bkinfo.books as b
ORDER BY Page_Count DESC

现在我得到了这个结果。
Book_ID  Page_Count Rank
1448    3192    1
1306    2895    2
1979    1368    3
1678    1002    4
1677    982     5
1689    980     6

我需要弄清如何完成50页范围的操作。
1个回答

4
我认为您正在寻找这样的内容:

我想您需要的是这个:

select
  book_id,
  page_count,
  (select count(distinct b2.page_count DIV 50)
   from books b2
   where b2.page_count DIV 50 >= books.page_count DIV 50) as page_rank
from books
order by page_count desc

太好了!谢谢,应该是大于等于而不是小于等于。你能解释一下 DIV 50 是什么意思吗? - yan
@RaymondYan,DIV是模数的补充,或者说%:它执行整数除法并将整数部分作为整数返回,而不是浮点数。例如,SELECT 5 DIV 2返回2,而不是2.5。 - Daniel Miladinov
@RaymondYan DIV 是整数除法,例如 5 DIV 2 = 2,在你的例子中,2000 DIV 50 是40,1300 DIV 50 是26,而982、980、975和970 DIV 50都是19。 - fthiella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接