2015-04-25 41 views
1

我有以下表格:收音機,播客和節目。收音機有很多播客,而播客有很多節目。每個播客都可以按其歷史排序,每個節目可以按其publication_date排序。Multiple ORDER BY(獲取最新元素)MySQL

我想獲得所有與他們的最新節目相關的播客。

查詢看起來像這樣:

SELECT r.name AS radio_name,Pod.*,Sh.* 
FROM podcasts Pod 
    INNER JOIN radios r ON (r.id=Pod.radio_id) 
    INNER JOIN shows Sh ON (Sh.podcast_id=Pod.id) 
ORDER BY Pod.history LIMIT 5 

我想有第二ORDER BY Sh.publication_date,但我真的不知道它應該的。

回答

3

如果你只想要爲每個播客最新的展會,那麼你需要一些東西來獲得這些信息。這裏有一個方法:

SELECT r.name AS radio_name,Pod.*,Sh.* 
FROM podcasts Pod INNER JOIN 
    radios r 
    ON r.id = Pod.radio_id INNER JOIN 
    shows Sh 
    ON Sh.podcast_id = Pod.id 
WHERE NOT EXISTS (select 1 
        from shows sh2 
        where sh2.podcast_id = sh.podcast_id.id and 
         sh2.publication_date > sh.publication_date 
       ) 
ORDER BY sh.publication_date DESC 
LIMIT 5; 

除了「明顯的」索引連接列上,你walso想在shows(podcast_id, publication_date)的索引。

我也在猜測,您要按照最近的顯示排序的結果發佈日期。

+0

這應該工作,謝謝,除了我然後想要通過他們的歷史訂購每個播客(這是另一個領域來顯示他們的可處置性) – johnmalkovitch

+0

我只注意到一個小問題:我得到多個相同的播客與不同的關聯顯示,我相信這是不存在的情況出現錯誤,但我不明白爲什麼。 – johnmalkovitch

+0

@johnmalkovitch。 。 。對於每個'podcast.id',這應該只返回一個節目 - 除非兩個節目具有完全相同的日期。您可以在播客中使用多個名稱,也可以在同一日期使用多個節目。 –

0

您可以用逗號將order by子句中分隔多個表達式:

SELECT r.name AS radio_name,Pod.*,Sh.* 
FROM podcasts Pod 
    INNER JOIN radios r ON (r.id=Pod.radio_id) 
    INNER JOIN shows Sh ON (Sh.podcast_id=Pod.id) 
ORDER BY Pod.history, Sh.publication_date LIMIT 5 
------------- Here -^ 
+0

是的,但我想檢索5播客(限制5),並與每個人有最新的節目。按照您描述的方式進行操作,查詢需要超過1秒,這個時間不應超過30毫秒,因此出現問題 – johnmalkovitch

+0

@johnmalkovitch關於查詢速度,您是否在所有列上都有索引出現在'JOIN'和'ORDER BY'子句中? – axiac

+0

速度問題如下:當我做@Mureinik告訴我的請求時,對於那些播客,我得到了5次相同的播客,並有5次不同的節目(遞減發佈日期)。我需要5個不同的播客(按他們的歷史排序)和他們的最新節目(按刊物日期排序)。 – johnmalkovitch