インテリジェントなタグベース画像検索システムです。ユーザーは、そのようなテーブルに適切なタグを付けて画像を追加します。
image (id, title, ...)
tag (id, title) /* It doesn't matter who has created the tag*/
imagetag (image_id, tag_id) /* One image may have multiple tags */
ユーザーが画像を表示し、 *それらの画像のタグ*からの訪問がテーブルに記録されusertagviewます。(私はINSERT ON DUPLICATE UPDATEその目的のためにクエリを使用したことに注意してください。)
usertagview (user_id, tag_id, view_count)
ここで、次のタグが付いたいくつかの画像を検討してください。
river、day(晴れた日の川を写した写真です)river、night(真夜中の月の光に照らされたあの川)tree、daytree、nightflower、dayflower、night
ユーザーがタグを検索すると、riverriverというタグが付いた画像が表示されます。この場合、最初の画像(川の日でタグ付け)と2番目の画像(川の夜でタグ付け)が表示されます。ユーザーは2番目の画像(とでタグ付けされた)を表示し、それがテーブルに記録されていることを表示します。rivernightusertagview
次に、ユーザーはタグの新しい検索を試み、画像treeを表示しtree nightます。
ユーザーがを検索する場合はflower、よりflower nightも優先されるようにしflower dayます。つまりflower night、前に来る必要がありますflower day。言い換えれflowerば、ユーザーの以前のビューに従ってタグ付けされた画像を一覧表示するクエリが必要です。(flower night最初に、OTHERflowerが次に)。
失敗した私のクエリ:
SELECT
    DISTINCT (image.id) AS image_id,
    image.title AS image_title,
    SUM(usertagview.view_count) AS SUM_of_all_tag_views_for_each_image
FROM (image)
JOIN imagetag ON imagetag.image_id = image.id
**LEFT JOIN** usertagview ON
    usertagview.tag_id = imagetag.tag_id
    AND usertagview.user_id = {$user_id_from_php}
WHERE
    imagetag.tag_id IN ( {impolde(',', $array_of_id_of_tags_that_the_user_has_entered)} )
    AND
    usertagview.tag_id IN
        (SELECT tag_id FROM imagetag WHERE userimagetag.image_id = image.id)
ORDER BY SUM_of_all_tag_views_for_each_image DESC
問題
**LEFT JOIN**私のクエリのは通常のと違いがないということですINNER JOIN。どちらも同じ結果になります。使っRIGHT JOINても違いはありません。