2012-07-19 31 views
3

假設你有2個表是這樣的:Mysql的「複雜」之類的

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 | 
+----+------------+---------------------+----------+ 

我幾乎可以肯定是有辦法做到這一點使用單個查詢,但我不能弄明白。

你會怎麼做到這一點?

+0

爲每個需要的案例創建單獨的查詢,並將它們與[UNION](http://dev.mysql.com/doc/refman/5.5/en/union.html)放在一起 – Laimoncijus 2012-07-19 13:41:59

+0

@Laimoncijus:有隻有一種情況:每個主題(如果有的話)的最近文章,然後是每個主題的第二最近文章(如果有的話)等等...... – OcuS 2012-07-19 13:48:15

+0

也許這可以幫助您 - > http://lists.mysql.com/ mysql/209784 – Panagiotis 2012-07-19 13:58:32

回答

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

您可以嘗試這個查詢at SQL Fiddle

+0

你讓我的一天先生:) – OcuS 2012-07-19 14:40:04

0

你可以做一個'文章連接主題',然後通過update_date,sort_order?

+0

不,因爲在這種情況下,無論主題如何,我都會先獲取所有最近的文章。 – OcuS 2012-07-19 13:44:53