2009-09-16 91 views
3

我正在查看是否可以通過單個查詢獲得我需要的結果,而且我的MySQL技能仍處於青春期。在查詢中限制MySQL結果

我有4個表格:shows,artists,venuestours。我的主要查詢的簡化版本,現在看起來是這樣的:

SELECT * 
    FROM artists AS a, 
      venues AS v, 
      shows AS s 
LEFT JOIN tours AS t ON s.show_tour_id = t.tour_id 
    WHERE s.show_artist_id = a.artist_id 
     AND s.show_venue_id = v.venue_id 
ORDER BY a.artist_name ASC, s.show_date ASC; 

我想補充的是,有多少節目返回每個藝術家的限制。我知道我可以SELECT * FROM artists,然後爲每個返回的行運行一個簡單的LIMIT子句的查詢,但我認爲必須有一個更有效的方法。

更新:把這個更簡單,我想爲每個藝術家選擇最多5個節目。我知道我能做到這一點(剝離了所有不相干):

<?php 
    $artists = $db->query("SELECT * FROM artists"); 
    foreach($artists as $artist) { 
     $db->query("SELECT * FROM shows WHERE show_artist_id = $artist->artist_id LIMIT 5"); 
    } 
?> 

但似乎錯了要放一個foreach環內的另一查詢。我正在尋找一種在一個結果集內實現這一目標的方法。

+0

如果您不想使用LIMIT,您需要向我們提供應該如何完成。 「SHOWS」表中是否有日期字段? – 2009-09-16 15:45:21

+0

並不是我不想使用「LIMIT」 - 這是因爲我需要使用每個藝術家的「LIMIT」*,而不是整個查詢。因此,如果我有5位藝術家,並且他們都有5個或更多的節目,我想要25個總結果(如果某些藝術家少於5個節目,則要少些)。那有意義嗎? – 2009-09-16 16:07:12

回答

1

這是存儲過程的用途。

選擇藝術家列表,然後遍歷該列表,爲每個藝術家添加5個或更少的節目到臨時表。

然後,返回臨時表。

+0

我對存儲過程並不熟悉,但因爲這是一個WordPress插件,所以我需要支持MySQL 4.0。看起來存儲過程是5.0的增加。感謝這個想法,但我應該更多地瞭解這一點。 – 2009-09-16 18:00:33

1

作爲一個計劃-B,如果你無法確定正確的SQL語句來使用,你可以將整個事物讀入一個內存構造(數組,類等)並以此方式循環。如果數據足夠小,並且內存足夠大,則只能執行一個查詢。不高雅,但可能適合你。

+0

不錯主意:過濾並切片數組。但絕對是一個計劃B. – 2009-09-16 18:03:41

1

那麼我不願提出這個建議,因爲它肯定不會在計算上有效率(請參閱存儲過程對此的回答...),但它將全部在您想要的一個查詢中。我也採取了一些自由,並假設你想要5個最近的節目......希望你可以修改你的實際需求。

SELECT * 
FROM artists AS a, 
     venues AS v, 
     shows AS s 
LEFT JOIN tours AS t ON s.show_tour_id = t.tour_id 
WHERE s.show_artist_id = a.artist_id 
    AND s.show_venue_id = v.venue_id 
    AND s.show_id IN 
    (SELECT subS.show_id FROM shows subS 
     WHERE subS.show_artist_id = s.show_artist_id 
     ORDER BY subS.show_date DESC 
     LIMIT 5) 
ORDER BY a.artist_name ASC, s.show_date ASC; 
+0

我剛剛閱讀你的評論,你需要MySQL 4.我不認爲MySQL 4有子查詢,所以這可能不會幫助你。我會把它留在這裏以防它可能幫助別人。 – CarlG 2009-09-17 02:24:53