在查询中限制MySQL结果

时间:2009-09-16 12:08:52

标签: sql mysql limit

我想看看我是否可以通过单个查询获得我需要的结果,而且我的MySQL技能在这里仍处于青春期。

我有4个表:showsartistsvenuestours。我的主要查询的简化版现在看起来像这样:

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循环中放置另一个查询似乎是错误的。我正在寻找一种在一个结果集中实现这一目标的方法。

3 个答案:

答案 0 :(得分:1)

这是存储过程的用途。

选择一个艺术家列表,然后循环浏览该列表,为每个艺术家添加5个或更少的节目到临时表。

然后,返回临时表。

答案 1 :(得分:1)

作为计划B,如果你无法想象使用正确的SQL语句,你可以将整个事物读入内存构造(数组,类等)并以这种方式循环。如果数据足够小并且内存可用足够大,那么您只能进行一次查询。不优雅,但可能适合你。

答案 2 :(得分: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;