インテリジェントなタグベース画像検索システムです。ユーザーは、そのようなテーブルに適切なタグを付けて画像を追加します。
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
、day
tree
、night
flower
、day
flower
、night
ユーザーがタグを検索すると、riverriver
というタグが付いた画像が表示されます。この場合、最初の画像(川の日でタグ付け)と2番目の画像(川の夜でタグ付け)が表示されます。ユーザーは2番目の画像(とでタグ付けされた)を表示し、それがテーブルに記録されていることを表示します。river
night
usertagview
次に、ユーザーはタグの新しい検索を試み、画像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
ても違いはありません。