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
  • テーマごとに並べられた、各テーマの 2 番目に新しい記事sort_order
  • テーマごとに並べられた、各テーマの 3 番目に新しい記事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 DESCtheme_id

このクエリは SQL Fiddle で試すことができます。

于 2012-07-19T14:19:55.730 に答える
0

「記事の結合テーマ」を実行してから、update_date、sort_order で並べ替えていただけますか?

于 2012-07-19T13:41:36.353 に答える