2012-01-13 3 views
0

私は現在、人々がビデオを見ているすべてのvid_idを選択し、ほとんどの視聴者によってそれらを並べ替えるクエリを持っています。誰かがビデオを見るたびに、scrusersonlineに項目vid_idusernametimestampという項目が作成されます。Select *タグ名がジャンクションテーブルにある

私はtag_mapテーブルとtagsテーブルも持っています。 tag_mapにはフィールドidtag_idvid_idが含まれ、タグにはフィールドtag_idnameが含まれています。すべてのvid_id結果が特定のタグ名に対してのみ表示されるように、以下のクエリを変更するだけです。専門家の助けを借りてありがとうございます。

変更しようとしているクエリ。 scrusersonlineには、フィールドvid_idのタイムスタンプusernameがあります。それは、ほとんどのユーザが降順で視聴し、vid_idを検索します。私はさらに、特定のタグ名

SELECT SQL_CALC_FOUND_ROWS scrusersonline.vid_id, COUNT(scrusersonline.id) 
AS idcount FROM scrusersonline 
    GROUP BY scrusersonline.vid_id ORDER BY idcount DESC 

以下のクエリにそれらの結果を制限したいと思い、単に特定のタグ名を持つすべてvid_id年代を選択する例であるが、ビデオのテーブルとリンクされています。それだけで、タグ名の結果を示しているように、私は、上記のクエリを変更できるようにしたいと思い

SELECT SQL_CALC_FOUND_ROWS video.* FROM tag_map 
       INNER JOIN tags2 ON tags2.tag_id = tag_map.tag_id 
INNER JOIN video ON video.vid_id = tag_map.vid_id 
    WHERE name IN (?) 
    ORDER BY video.timestamp DESC LIMIT ?, ? 

答えて

1

あなたの結果を与える必要があり、次の

SELECT SQL_CALC_FOUND_ROWS a.vid_id, count(a.id) as idCount 
FROM scruseronline as a 
INNER JOIN tag_map as b 
ON b.vid_id = a.vid_id 
INNER JOIN tags2 as c 
ON c.tag_id = b.tag_id 
AND c.name IN (?) 
GROUP BY a.vid_id 
ORDER BY idCount DESC 

ああ、あなたがしたいこと他のフィールドの組み合わせがユニークでなければなりませんよう、tag_mapからidを削除し、サロゲートキーは通常、参照されないがあります。

+0

優秀、あなたの時間と援助X-Zeroに感謝します!ところで、idはtag_mapの一意のフィールドです。私は、それぞれの接続を参照することが有用であると思った。サロゲートキーが参照されているとはどういう意味ですか? – Scarface

+1

'tag_map'の' id'は_surrogateキーです。つまり、テーブル内の行を一意に識別するために使用される人為的な(属性データではない)値です。しかし、純粋な/単純な相互参照テーブル( 'tag_map'のような)の場合、それらは無意味です。関係は一意の行であり、実際のデータを構成する外部キー参照は完全に受け入れられるキーです。 'id'自体はほとんど参照されません - データベースは属性列を使用しているので、あなたはそれらによって削除されるはずです... –

+0

そうです。私はなぜそれを残したのか分かりません。私はそれを批判的に調べたことはありません。もう一度X-Zeroに感謝します。本当に役に立ちました。本当に感謝しています。 – Scarface

関連する問題