SELECT * FROM theme; +----+---------+------------+ | id | name | sort_order -6ren">
gpt4 book ai didi

Mysql "complex"排序

转载 作者:可可西里 更新时间:2023-11-01 07:59:37 26 4
gpt4 key购买 nike

假设您有 2 个这样的表:

mysql> SELECT * FROM theme;
+----+---------+------------+
| id | name | sort_order |
+----+---------+------------+
| 1 | Theme 1 | 1 |
| 2 | Theme 2 | 2 |
| 3 | Theme 3 | 3 |
| 4 | Theme 4 | 4 |
| 5 | Theme 5 | 5 |
| 6 | Theme 6 | 6 |
| 7 | Theme 7 | 7 |
+----+---------+------------+

mysql> SELECT * FROM article;
+----+------------+---------------------+----------+
| id | title | update_date | theme_id |
+----+------------+---------------------+----------+
| 1 | Article 1 | 2012-06-29 15:29:50 | 6 |
| 2 | Article 2 | 2012-07-18 00:00:00 | 2 |
| 3 | Article 3 | 2012-07-19 00:00:00 | 4 |
| 4 | Article 4 | 2012-07-18 00:00:00 | 4 |
| 5 | Article 5 | 2012-07-18 00:00:00 | 1 |
| 6 | Article 6 | 2012-06-26 10:30:51 | 6 |
| 7 | Article 7 | 2012-07-18 15:17:08 | 6 |
| 8 | Article 8 | 2012-06-18 00:00:00 | 4 |
| 9 | Article 9 | 2012-07-18 15:48:28 | 1 |
| 10 | Article 10 | 2012-07-09 00:00:00 | 4 |
+----+------------+---------------------+----------+

每篇文章都绑定(bind)到唯一的主题。

您希望能够执行一个查询,为您提供这样排序的文章列表:

  • 每个主题的第一篇最新文章,按主题的 sort_order
  • 排序
  • 按主题的 sort_order 排序的每个主题的第二篇最新文章
  • 按主题的 sort_order 排序的每个主题的第三篇最新文章
  • 等等...

对于当前数据,它应该给出以下内容:

+----+------------+---------------------+----------+
| id | title | update_date | theme_id |
+----+------------+---------------------+----------+
| 9 | Article 9 | 2012-07-18 15:48:28 | 1 |
| 2 | Article 2 | 2012-07-18 00:00:00 | 2 |
| 3 | Article 3 | 2012-07-19 00:00:00 | 4 |
| 7 | Article 7 | 2012-07-18 15:17:08 | 6 |
| 5 | Article 5 | 2012-07-18 00:00:00 | 1 |
| 4 | Article 4 | 2012-07-18 00:00:00 | 4 |
| 1 | Article 1 | 2012-06-29 15:29:50 | 6 |
| 10 | Article 10 | 2012-07-09 00:00:00 | 4 |
| 6 | Article 6 | 2012-06-26 10:30:51 | 6 |
| 8 | Article 8 | 2012-06-18 00:00:00 | 4 |
+----+------------+---------------------+----------+

我几乎可以肯定有一种方法可以使用单个查询来执行此操作,但我想不通。

您将如何实现这一目标?

最佳答案

这个和MySQL中分区排序的问题有关。 MySQL中没有windowed ranking functions,但是泛型问题可以借助变量成功解决:

SELECT
id,
title,
update_date,
theme_id
FROM (
SELECT
*,
@rnk := @rnk * (@last_theme = theme_id) + 1 AS rnk,
@last_theme := theme_id
FROM article, (SELECT @rnk := 0, @last_theme := 0) s
ORDER BY theme_id, update_date DESC
) s
ORDER BY
rnk, theme_id
;

上述查询都对行进行排名,然后使用排名对最终结果集进行排序。该查询首先从 article 中检索行,按 theme_idupdate_date DESC 对它们进行排序以分配排名编号。然后,当从排名行集中选择时,引入另一个最终排序,这次是通过排名和 theme_id

您可以试试这个查询 at SQL Fiddle .

关于Mysql "complex"排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11561941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com