2011-06-22 7 views
0

私はプレイリストのために最優秀結果の検索を実装しようとしています。テーブルはとても似ています:

プレイリスト: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行だけ返します。プレイリストは最初のビデオと一致します。サブクエリを一番上の結果に制限するにはどうしたらよいですか?複数行回答の最終結果はまだありますか?

答えて

2

を動作するはずですyoutube_id。その後、youtube_idというシングルにvideosというJOINを実行したときに、1つのレコードが表示されます。

サブクエリ内のplaylistsテーブルのみを選択し、playlist_assignmentsのJOINをvideosジョインと一緒に移動することがあります。何かのように:このことができます

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

希望:

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; 

クエリがある提案しました。もしそれがうまくいくか、そうでなかったら教えてください。

+0

ありがとう、これは私が見落としたものです! – Ripptor

0

私がテストしていませんが、アイデアは、あなたが持っている各ユーチューブの動画分間のプレイリストIDを取得するには、あなたのサブクエリで集計MINを使用しようとすることで、その後、プレイリストテーブルに

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 
0

をそれに参加あなたのクエリが書かれている方法では、playlist_assignmentsの結果を1に制限します。正しく理解すれば、1つのプレイリストが必要ですが、そのプレイリストのすべてのビデオが必要です。その場合は、あなたのクエリを変更するこの方法は、あなたのクエリの問題は、サブクエリを使用すると、1つのプレイリストを取得したもののことを意味し、LIMIT 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 
関連する問題