Ограничение результатов MySQL в запросе - PullRequest
3 голосов
/ 16 сентября 2009

Я смотрю, смогу ли я получить нужные мне результаты одним запросом, и мои навыки работы с MySQL все еще находятся в юности.

У меня есть 4 таблицы: shows, artists, venues и tours. Упрощенная версия моего основного запроса сейчас выглядит так:

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 ]

1 голос
/ 16 сентября 2009

Как план-B, если вы не можете определить правильный оператор SQL для использования, вы можете прочитать все это в структуре памяти (массив, класс и т. Д.) И зациклить ее таким образом. Если данные достаточно малы, а объем доступной памяти достаточно велик, это позволит вам выполнить только один запрос. Не элегантно, но может работать на вас.

1 голос
/ 17 сентября 2009

Ну, я не решаюсь предложить это, потому что это, конечно, не будет вычислительно эффективным (см. Ответ хранимых процедур за это ...), но все это будет в одном запросе, как вы хотели. Я также беру на себя некоторые свободы и предполагаю, что вы хотите 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;
1 голос
/ 16 сентября 2009

Для этого предназначены хранимые процедуры.

Выберите список исполнителей, затем прокрутите этот список, добавив 5 или менее шоу для каждого исполнителя в временную таблицу.

Затем верните временную таблицу.

...