2015-04-29 41 views
0

只要有一個棘手的與MySQL的阻塞。 我有3個表:MySQL:選擇三個最後一個項目INNER JOIN

電視

| TV_ID | TV_name | 
---------------------- 
| 1 | HBO | 
| 2 | BBC | 
| 3 | Fox news | 
---------------------- 
---------------------- 
---------------------- 

排放

| E_ID | E_TV_ID | E_NAME | 
------------------------------- 
| 1 | 1 | Weather | 
| 2 | 1 | News  | 
| 3 | 1 | FAKE1 | 
| 4 | 1 | FAKE2 | 
| 5 | 1 | FAKE3 | 
| 6 | 1 | FAKE4 | 
| 7 | 2 | FAKE5 | 
| 8 | 2 | FAKE6 | 
| 9 | 2 | FAKE7 | 
| 10 | 2 | FAKE8 | 
| 11 | 2 | FAKE9 | 
| 12 | 2 | FAKE10 | 
| 13 | 2 | FAKE11 | 
| 14 | 3 | FAKE12 | 
| 15 | 3 | FAKE13 | 
| 16 | 3 | FAKE14 | 
| 17 | 3 | FAKE15 | 
| 18 | 3 | FAKE16 | 
| 19 | 3 | FAKE17 | 
| 20 | 3 | FAKE18 | 
------------------------------- 
------------------------------- 
------------------------------- 

重播

| R_ID | R_E_ID | R_DATE | R_URL_REPLAY | 
------------------------------------------- 
| 1 | 1 | 20150431 |  URL1  | 
| 2 | 20 | 20150431 |  URL2  | 
| 3 | 19 | 20150431 |  URL3  | 
| 4 | 2 | 20150431 |  URL4  | 
| 5 | 7 | 20150431 |  URL5  | 
| 6 | 16 | 20150430 |  URL6  | 
| 7 | 10 | 20150430 |  URL7  | 
| 8 | 1 | 20150430 |  URL8  | 
| 9 | 4 | 20150430 |  URL9  | 
| 10 | 9 | 20150430 |  URL10 | 
| 11 | 19 | 20150429 |  URL11 | 
| 12 | 2 | 20150429 |  URL12 | 
| 13 | 1 | 20150429 |  URL13 | 
| 14 | 12 | 20150429 |  URL14 | 
------------------------------------------- 
------------------------------------------- 
------------------------------------------- 

我想只能創建一個查詢來獲取每3日最後發射電視,按日期排序和電視(如果可能)。因此,對於這個例子,我有3臺電視機。 3 * 3 = 9個排放,如:

| TV_ID | E_NAME | R_URL_REPLAY | 
------------------------------------- 
| 1 | Weather |  URL1  | 
| 1 | FAKE2 |  URL4  | 
| 1 | FAKE6 |  URL8  | 
| 2 | FAKE3 |  URL5  | 
| 2 | FAKE8 |  URL7  | 
| 2 | FAKE7 |  URL10 | 
| 3 | FAKE18 |  URL2  | 
| 3 | FAKE17 |  URL3  | 
| 3 | FAKE14 |  URL6  | 

我已經嘗試了很多解決方案(INNER JOIN - 選擇..從(SELECT ...) - 使用VAR @:= - 小分細分子查詢),但不是工程.. 只有當我用工會的工作,但我已經超過20個電視,寫20 UNION真的urgly ..

如果你有建議,

謝謝提前,

回答

0

這不是簡單的,但簡而言之,按電視和日期排序您的重播,然後排名他們,然後s選擇符合您的排名標準的人。

select * 
    from (
    select if(@prev = e_tv_id, @rank := @rank +1, @rank := 1 and @prev := e_tv_id) as rank, q.* 
     from ( 
     select e.e_tv_id, r_date, r_url_replay 
      from emission e 
      join (select @prev := 0, @rank := 1) q 
      inner join replay r 
      on r.r_e_id = e.e_id 
     order by e.e_tv_id asc, r.r_date desc 
    ) q 
) qq 
where rank <=3 ; 

demo here

+0

哇大。像魅力一樣工作。 非常感謝pala_從來沒有找到.. – magexcustomer

+0

@ imagexcustomer很高興聽到它。我並不特別相信這是另一個問題的完全重複,我也不相信這個問題上最高評分的答案是什麼都不錯 - 尤其是「去閱讀鏈接」。 –

+0

只是要知道,你用來找到這個答案的關鍵字? 花了很多時間搜索,但顯然不使用efficiente關鍵字.. – magexcustomer