2009-09-16 2 views
3

Я ищу, чтобы узнать, могу ли я получить результаты, которые мне нужны, с одним запросом, и мои навыки MySQL все еще находятся в подростковом возрасте.Ограничение результатов 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 для каждой возвращенной строки, но я считаю, что должен быть более эффективный способ.

UPDATE: Чтобы это проще сказать, я хочу выбрать до 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? –

+0

Не то, чтобы я не хотел использовать 'LIMIT' - мне нужно использовать' LIMIT' * для каждого исполнителя *, а не для всего запроса. Поэтому, если у меня есть 5 исполнителей, и у всех их есть 5 или более шоу, я хочу 25 итоговых результатов (или меньше, если у некоторых из исполнителей меньше 5 показов). Имеет ли это смысл? –

ответ

1

Это то, что хранится в хранимых процедурах.

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

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

+0

Я не знаком с хранимыми процедурами, хотя, поскольку это для плагина WordPress, мне нужно поддерживать MySQL 4.0. Похоже, что хранимые процедуры дополняют 5.0. Спасибо за эту идею, но я должен узнать больше об этом. –

1

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

+0

Неплохая идея: фильтровать и нарезать массив. Но определенно план B. –

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

Смежные вопросы