限制子查询而不限制整个查询

时间:2011-06-22 15:28:28

标签: mysql subquery limit

我正在尝试为播放列表实现最高搜索结果。表格如下:

播放列表:id,标题
作业:id,youtube_id,位置
视频:youtube_id,标题

所以加入他们就是:播放列表=(id)=作业=(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 个答案:

答案 0 :(得分:2)

您的查询的问题是子查询正在执行LIMIT 1,这意味着虽然您检索了单个播放列表,但您还检索了一个youtube_id。那么你什么时候在videos上使用youtube_id加入了JOIN,它会为你提供一条记录。

修复可能只是从子查询中的playlists表中选择SELECT,并将playlist_assignments的JOIN与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`;

希望这会有所帮助。让我知道它是否有效或是否有效。

答案 1 :(得分:0)

我还没有测试过,但想法是尝试在子查询中使用聚合MIN来获取每个youtube视频的最小播放列表ID,然后将其加入播放列表表格

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

答案 2 :(得分:0)

您的查询编写方式,您将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