3

想象一下,你有 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 |
+----+------------+---------------------+----------+

每篇文章都绑定一个且只有一个主题。

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

  • 按主题排序的每个主题的第一篇最新文章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 |
+----+------------+---------------------+----------+

我几乎可以肯定有一种方法可以使用单个查询来做到这一点,但我无法弄清楚。

您将如何实现这一目标?

4

2 回答 2

5

这与 MySQL 中的分区排序问题有关。MySQL 中没有加窗排序函数,但是可以借助变量成功解决泛型问题:

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

您可以在 SQL Fiddle尝试此查询。

于 2012-07-19T14:19:55.730 回答
0

你能做一个“文章加入主题”,然后按 update_date、sort_order 排序吗?

于 2012-07-19T13:41:36.353 回答