2017-12-22 7 views
0

目的でSELECT文を使用して:私は4つのテーブルを持っている...MYSQLクエリ - 箇条

をユーザーが(チームや選手を)言っていたタグに一致するすべての動画を取得します。

私はどこのユーザの選手すべてのタグを見つける必要があり、私はuser_team_trackerテーブルから

を、ユーザのチームのすべてを取得取得する必要がありuser_player_trackerテーブル

からユーザーのプレーヤーのすべてを取得取得する必要があります

または、ユーザーのチームはuser_video_tagsテーブルから存在し、私は最終的にuser_video_tagsのVIDEO_IDが、私は時間のまわりで私の頭をラップすることはできません

user_videosからidがあるidとvideo_urlを取得する必要があります

これをすべて行うには、これまで私がこれまで持っていたものがここにあります...

SELECT v.id, v.video_url FROM user_videos v 
LEFT JOIN user_video_tags t 
ON t.video_id = v.id 
WHERE (
    SELECT t.video_id FROM user_video_tags t 
    LEFT JOIN user_player_tracker up 
    ON up.site_id = t.site_id AND up.player_id = t.player_id 
    WHERE up.user_id = {$userid}) 
|| (
    SELECT t.video_id FROM user_video_tags t 
    LEFT JOIN user_team_tracker ut 
    ON ut.site_id = t.site_id AND ut.team_id = t.player_id 
    WHERE ut.user_id = {$userid}) 

答えて

0

私は2つのステップでこれを行う必要がありました。まず、連合を使ってすべてのタグ付き動画を取得します。私は 'group by'を使用して各クエリで重複を取得せず、 'union all'の代わりに 'union'を使用すると、結合された結果から一意のvideo_idがすべて取得されます。私はmysqlステートメントでgroup byとunionを使って注文する方法を理解できなかったので、php arsort($ results)を使ってビデオのリストを注文しました。その後、各タグの動画を取得するために各結果をループするだけでした。

$results = $wpdb->get_results(" 
    SELECT t.video_id FROM user_video_tags t 
    LEFT JOIN user_player_tracker up 
    ON up.site_id = t.site_id AND up.player_id = t.player_id 
    WHERE up.user_id = {$userid} 
    GROUP BY t.video_id 
    UNION 
    SELECT t.video_id FROM user_video_tags t 
    LEFT JOIN user_team_tracker up 
    ON up.site_id = t.site_id AND up.team_id = t.team_id 
    WHERE up.user_id = {$userid} 
    GROUP BY t.video_id 
    LIMIT 20"); 

    arsort($results); 

if($results){ 
    foreach ($results as $item) { 
     // call another function that gets the video 
     $html .= get_media($item->video_id); 
    } 
} else { 
    $html .= 'No videos found for this user, wEird.<br/>'; 
}