1

この質問はこれと似ていますが、違いがあります。8 種類のタグがあります。

このようなもの:

videos      [id, title]
tags1       [id, tag]
tags2       [id, tag]
tags3       [id, tag]
tags4       [id, tag]
tags5       [id, tag]
tags6       [id, tag]
tags7       [id, tag]
tags8       [id, tag]
video_tags1 [vid_id, tag_id]
video_tags2 [vid_id, tag_id]
video_tags3 [vid_id, tag_id]
video_tags4 [vid_id, tag_id]
video_tags5 [vid_id, tag_id]
video_tags6 [vid_id, tag_id]
video_tags7 [vid_id, tag_id]
video_tags8 [vid_id, tag_id]

単一の video.id を指定すると、タグの共通点が最も多い関連動画を選択したいと考えています。サーバーをひざまずかせない方法は言うまでもなく、これを行う方法を見つけるのは難しいと思います。

4

2 に答える 2

2

データベースモデルを変更できる場合は、これらの提案が適している可能性があります。

次のようにテーブルを再定義します。

videos      [id, title]
tags    [id, tag_type,tag]
videos_tags [vid_id, tag_id]

一貫性を高めるために、tag_typeテーブル(タグタイプごとに1つずつ、8つの行があります)を追加することもできます。

次に、このクエリ(構文エラーがある可能性がありますが、私の意図はあなたがアイデアを得ることにあります)は、ビデオIDと提供されたものと一致するタグの数を提供します:

select 
       videos.id, count(videos.id) as nEqualTags 
from 
       videos videos inner join  video_tags vtags on  (vtags.vid_id=videos.id )
where 
       vtags.tag_id in (select tag_id from videos_tags where vt.id = ?) 
group by 
       videos.id 
order by 
       nEqualTags desc

nEqualTagsが特定の値よりも低い場合は、結果を削減するために、さらにロジックを追加できます。

(また、パフォーマンスを向上させるためにインデックスを追加することも検討してください)。

それが役に立てば幸い

于 2012-11-07T16:39:28.363 に答える
1

正規化されたテーブルで作業することは常に良い考えだと思います。この場合、次の UNION クエリが役立ちます。

(select 1 as tab, vid_id, tag_id from video_tags1
 union select 2 as tab, vid_id, tag_id from video_tags2
 union select 3 as tab, vid_id, tag_id from video_tags3
 ...)

次のようなクエリを使用する必要があります。

SELECT
  tags_1.vid_id, count(*) as common_tags
FROM
  (big union above) video_tags
  INNER JOIN
  (big union above) video_tags_1
  ON video_tags.tab = video_tags_1.tab
  AND video_tags.tags_id = video_tags_1.tags_id
  AND video_tags.vid_id = 1
  AND video_tags_1.vid_id <> 1
GROUP BY video_tags_1.vid_id
ORDER BY common_tags DESC

これにより、共通のタグの数で DESC に並べられたすべてのレコードが返されます。これは、どのように進めるかのアイデアかもしれません。ビデオのタイトルを取得するには、JOIN をもう 1 つ追加する必要があります。共通のタグの説明も取得する必要がある場合は...可能ですが、クエリが非常に複雑になると思います!

データベース モデルを変更して、タグ用のテーブルとビデオ タグ用のテーブルだけを使用することはできませんか? それは物事をずっと簡単にするでしょう!

于 2012-11-07T16:49:50.487 に答える