关于多个相关标签和项关系的SQL查询

时间:2013-04-02 18:15:30

标签: php mysql sql tagging

我在SO中搜索了以下一些查询,但我找不到与我的搜索匹配的内容,而且我在ININNER JOIN和{{}}之间有点迷失{1}}写下来。

当前的数据库关系 enter image description here

1。按标签获取商品

LEFT JOIN是来自TAG.url的字符串,因此不是INT ID。

例如,使用网址$_GET,我们会收到以下请求。

对于一个容易但两个或更多的标签,以下似乎在mySQL中不起作用:

mydomain/items/tag1+tag2/

这个有效:

SELECT 
    ITEM.id AS 'item_id',
    ITEM.title AS 'item_title',
    ITEM.content AS 'item_content'
  FROM ITEM, ITEM_TAG, TAG
WHERE
  (ITEM.id=ITEM_TAG.id_item AND TAG.id=ITEM_TAG.id_dtag AND TAG.url='tag1')
AND
  (ITEM.id=ITEM_TAG.id_item AND TAG.id=ITEM_TAG.id_dtag AND TAG.url='tag2')
...
AND
  (ITEM.id=ITEM_TAG.id_item AND TAG.id=ITEM_TAG.id_dtag AND TAG.url='tagn')

此时,有没有比那些SELECT ITEM.id AS 'item_id', ITEM.title AS 'item_title', ITEM.content AS 'item_content' FROM ITEM INNER JOIN TAG TAG1 ON TAG1.url='tag1' INNER JOIN ITEM_TAG ITEM_TAG1 ON ITEM_TAG1.id_item=ITEM.id AND ITEM_TAG1.id_tag=TAG1.id INNER JOIN TAG TAG2 ON TAG2.url='tag2' INNER JOIN ITEM_TAG ITEM_TAG2 ON ITEM_TAG2.id_item=ITEM.id AND ITEM_TAG2.id_tag=TAG2.id ... INNER JOIN TAG TAGn ON TAG2.url='tagn' INNER JOIN ITEM_TAG ITEM_TAGn ON ITEM_TAGn.id_item=ITEM.id AND ITEM_TAGn.id_tag=TAGn.id INNER JOIN更好的方法呢?

2。获取其他标签的相关标签

在这里,我想获取标签列表以及与其他标签匹配的项目数。

例如,让我们想象下面的灯具:

ON

始终使用以下搜索 ITEM_TAG TAG id_item | id_tag id | url 1 | 1 1 | tag1 1 | 2 2 | tag2 1 | 3 3 | tag3 1 | 4 4 | tag4 2 | 1 2 | 2 2 | 3 3 | 1 3 | 2

我希望显示其他标记与某些项目的关系(如果存在这些关系)。

我很遗憾地说我不知道​​如何提出输出以下内容的请求:

mydomain/items/tag1+tag2/

如何获得此结果?

修改

我尝试了以下似乎有效:

    TAG
url    count(id_item)
tag3 | 2
tag4 | 1

任何有关优化此事的想法或建议都会受到极大关注。

1 个答案:

答案 0 :(得分:2)

<强> 1。按标签获取商品

select  i.id
,       i.title
,       i.content
from    item i
join    item_tag it
on      i.id = it.id_item
join    tag t
on      t.id = it.id_tag
where   t.url in ('tag1', 'tag2')

<强> 2。获取其他标签的相关标签

select  t2.url
,       count(it2.id_item)
from    tag t1 -- this tag
join    item_tag it1
on      t1.id = it.id_tag
join    item_tag it2 -- other tag for same item
on      it2.item_id = it1.item_id
join    tag t2
on      t2.id = it2.id_tag
where   t1.url in ('tag1', 'tag2')
        and t2.url not in ('tag1', 'tag2')
group by
        t2.url