我在SO中搜索了以下一些查询,但我找不到与我的搜索匹配的内容,而且我在IN
,INNER JOIN
和{{}}之间有点迷失{1}}写下来。
当前的数据库关系
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
任何有关优化此事的想法或建议都会受到极大关注。
答案 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