Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 限制子查询而不限制整个查询_Mysql_Subquery_Limit - Fatal编程技术网

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

Mysql 限制子查询而不限制整个查询,mysql,subquery,limit,Mysql,Subquery,Limit,我正在尝试对播放列表执行顶级结果搜索。这些表是这样的: 播放列表:id,标题 分配:id、youtube\u id、职位 视频:youtube\u id,标题 所以加入他们很简单:Playlist=(id)=Assignments=(youtube_id)=视频 我想找到标题匹配的第一个播放列表(标题不是唯一的),并将其与每个视频进行匹配,以返回该播放列表中的视频列表。我尝试了以下查询: SELECT * FROM ( SELECT id, title, position, youtu

我正在尝试对播放列表执行顶级结果搜索。这些表是这样的:

播放列表:id,标题
分配:id、youtube\u id、职位
视频:youtube\u 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行,播放列表仅与第一个视频匹配。如何将子查询限制为仅包含最上面的结果,但仍然有多行答案的最终结果?

我还没有测试过,但想法是尝试在子查询中使用聚合最小值来获取每个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

按照编写查询的方式,您可以将播放列表_分配的结果限制为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

查询的问题是子查询执行的是
LIMIT 1
,这意味着虽然您检索了一个播放列表,但同时也检索了一个
youtube\u id
。那么你什么时候在那张
youtube\u id
上运行了一个与
视频
的连接,它会给你一张记录

修复方法可能是仅从子查询中的
播放列表
表中进行选择,并将
播放列表分配的联接与
视频
联接一起移动到外部。比如:

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`;

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

谢谢,这正是我忽略的!