【发布时间】:2012-05-10 18:05:55
【问题描述】:
它是一个智能标签库图像搜索系统。用户在这样的表中添加带有适当标签的图像:
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
用户搜索标签 river 并显示任何带有标签 river 的图像:在这种情况下,第一张图像(由 river day 标记)和第二个(由河之夜标记)显示。用户查看第二张图片(标记为river 和night)并查看记录在表usertagview 中。
然后用户尝试重新搜索标签tree 并查看tree night 图像。
如果用户搜索flower,我希望flower night 优先于flower day。我的意思是flower night 应该在flower day 之前。换句话说,我想要一个查询,根据用户以前的视图列出由flower 标记的图像。 (flower night 首先,其他 flowers 下一个)。
我的查询失败:
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 也没有区别。
【问题讨论】:
标签: mysql sql join left-join outer-join