Ограничить подзапрос без ограничения всего запроса - PullRequest
0 голосов
/ 22 июня 2011

Я пытаюсь реализовать поиск по плейлисту с лучшим результатом.Таблицы выглядят так:Плейлист: id, названиеНазначения: id, youtube_id, positionВидео: youtube_id, названиеПоэтому присоединиться к ним просто: Playlist = (id) = Assignments = (youtube_id) = ВидеоЯ хочу найти первый плейлист по совпадению заголовков (названия не уникальны) и сопоставить его с каждым из его видео, чтобы вернуть список видео в этом плейлисте.Я попробовал следующий запрос:

SELECT * 
FROM ( 
SELECT id, title, position, youtube_id
FROM playlists p 
JOIN playlist_assignments pa 
USING(id) 
WHERE 1 and title = 'My Top Videos'
LIMIT 1
)d 
JOIN videos v 
USING (youtube_id)
ORDER BY position ASC

К сожалению, запрос вернет только 1 строку, список воспроизведения соответствует только первому видео.Как я могу ограничить подзапрос только лучшим результатом, но все же иметь окончательный результат ответа в несколько строк?

Ответы [ 3 ]

2 голосов
/ 22 июня 2011

Проблема с вашим запросом заключается в том, что подзапрос выполняет LIMIT 1, что означает, что, хотя вы получили один список воспроизведения, но вы также получили один youtube_id. Затем, когда вы запустили JOIN с videos на этом сингле youtube_id, он дает вам одну запись.

Исправление может заключаться в том, чтобы ВЫБРАТЬ только из таблицы playlists в подзапросе и переместить JOIN для playlist_assignments снаружи вместе с videos соединением. Что-то вроде:

SELECT *
FROM (
    SELECT id, title, position, youtube_id
    FROM playlists p 
    WHERE title = 'My Top Videos'
    LIMIT 1
) d 
JOIN playlist_assignments pa USING (id)
JOIN videos v 
USING (youtube_id)
ORDER BY position ASC;

Мой предложенный запрос:

SELECT `p`.`id` `playlist_id`, `p`.`title` `playlist_title`, `v`.`youtube_id` `youtube_id`, `v`.`title` `youtube_title`, `pa`.`position` 
FROM `playlists` `p`
INNER JOIN `playlist_assignments` `pa` ON `p`.`id` = `pa`.`id`
INNER JOIN `videos` `v` ON `pa`.`youtube_id` = `v`.`youtube_id`
WHERE `p`.`title` = 'My Top Videos'
ORDER BY `pa`.`position`;

Надеюсь, это поможет. Дайте мне знать, сработало ли это или нет.

0 голосов
/ 22 июня 2011

Как написан ваш запрос, вы ограничиваете результаты playlist_assignments до 1. Если я правильно понимаю, вам нужен только один плейлист, но все видео из этого плейлиста. В этом случае изменение вашего запроса должно работать

SELECT * 
FROM ( 
SELECT id, title
FROM playlists p 
WHERE 1 and title = 'My Top Videos'
LIMIT 1
)d 
JOIN playlist_assignments pa 
USING(id) 
JOIN videos v 
USING (youtube_id)
ORDER BY position ASC
0 голосов
/ 22 июня 2011

Я не тестировал, но идея состоит в том, чтобы попытаться использовать совокупный MIN в вашем подзапросе, чтобы получить минимальный идентификатор списка воспроизведения для каждого имеющегося у вас видео на YouTube, а затем присоединить его к таблице списка воспроизведения

SELECT p.*, v.*
FROM
  (SELECT MIN(id) AS id, youtube_id
  FROM playlists p 
  JOIN playlist_assignments pa USING(id) 
  WHERE Title = 'My Top Videos'
  GROUP BY youtube_id) AS firstPlaylistByVideo
JOIN playlists p ON p.id = firstPlaylistByVideo.id
JOIN videos v USING (youtube_id)
ORDER BY position ASC
...