2011-04-28 28 views
1

我在使用需要一些「複雜」排序的Mysql查詢時遇到問題。 我有2個表:使用MySQL查詢執行復雜排序

Training 
+--------------+------------------+ 
| training_id | training_name | 
+--------------+------------------+ 
|   1 | test1   | 
|   2 | test2   | 
|   3 | test3   | 
+--------------+------------------+ 

Training_venue 
+----------+--------------+------------+ 
| venue_id | training_id | venue_date | 
+----------+--------------+------------+ 
|  1 |   2 | 2009-06-01 | 
|  2 |   2 | 2012-06-01 | 
|  3 |   2 | 2011-06-01 | 
|  4 |   1 | 2009-09-01 | 
|  5 |   1 | 2011-09-01 | 
|  6 |   1 | 2012-09-01 | 
|  7 |   3 | 2009-01-01 | 
+----------+--------------+------------+ 

而且我期待的結果如下:

+--------------+------------------+------------+--------------+ 
| training_id | training_name | venue_id | venue_date | 
+--------------+------------------+------------+--------------+ 
|   2 | test2   |   2 | 2011-06-01 | 
|   2 | test2   |   3 | 2012-06-01 | 
|   1 | test1   |   6 | 2011-09-01 | 
|   1 | test1   |   5 | 2012-09-01 | 
+--------------+------------------+------------+--------------+ 

正如你所看到的,結果要求是:

  • 沒有一個培訓未來的場地被丟棄。
  • 過期的場地被丟棄
  • 的培訓是「組合」在一起
  • 的培訓與最快的場地是先用「最新最快的場地」訓練是最後
  • 裏面的訓練,比賽場館是從最早到最晚訂購。

什麼mysql查詢將返回結果集?

編輯: 這是我到目前爲止已經試過:

SELECT * 
FROM `training` AS t 
LEFT JOIN `training_venue` AS v USING (`training_id`) 
WHERE `venue_date` >= NOW() 
ORDER BY `training_id; 

但是如果training_id順序照顧保持所有訓練的「組合」在一起,它不容許下令從訓練訓練最快的場地進行最新的場地訓練。

我也編輯了數據表來說明有問題。看看結果如何排序,這不是通過training_id,而是通過最快的場地。

編輯: 更正日期。

+5

也許你可以告訴我們你到目前爲止設法提出的查詢是什麼,所以我們可以幫助你完成它,而不是僅僅期望有人爲你做所有的工作。 – 2011-04-28 14:57:54

+0

@AlanBarber你是對的,我剛剛編輯..希望它會有所幫助。 – FMaz008 2011-04-28 15:17:43

回答

2
SELECT t1.training_id, t1.training_name, t2.venue_id, t2.venue_date 
FROM Training t1 
INNER JOIN Training_venue t2 ON t1.training_id = t2.training_id 
WHERE t2.venue_date >= NOW() 
ORDER BY t1.training_id ASC, t2.venue_date ASC 

我不知道你最後的觀點是什麼:「在訓練中,場地的排序從最早到最晚。」但上面的查詢似乎與您的其他需求相匹配。

編輯:我現在有點更好地理解你以後。我認爲這有點複雜。我會再想一想。

編輯:我想我有它!

SELECT t1.training_id, t1.training_name, t2.venue_id, t2.venue_date 
FROM Training t1 
INNER JOIN (SELECT training_id, venue_date 
FROM training_venue 
WHERE venue_date >= NOW() 
GROUP BY training_id 
ORDER BY MIN(venue_date)) t3 ON t1.training_id = t3.training_id 
INNER JOIN Training_venue t2 ON t1.training_id = t2.training_id 
WHERE t2.venue_date >= NOW() 
ORDER BY t3.venue_date DESC, t2.venue_date ASC 

試試看!

編輯:使用'2010-01-01'而不是NOW()作爲NOW()將失去2010年的日期,你似乎想包括在內。

+1

雖然我同意上面的AlanBarber,但我只是覺得我有點無聊,我會幫忙的。但在將來發布你的嘗試,以便我們可以幫助而不是爲你做點事情。 – anothershrubery 2011-04-28 15:00:59

+0

@anothershrubery我同意你的意見。通常我會嘗試發佈我的嘗試。Hoverwer我完全停留在雙重訂購問題上,而我一直未能提出一些與「最快的場地的訓練是第一次的訓練,」最新最快的場地的訓練「是最後一部分」。 – FMaz008 2011-04-28 15:13:25

+0

@anothershrubery我剛剛編輯並解釋了一些你在最初的問題中沒有理解的點。 – FMaz008 2011-04-28 15:18:32