【发布时间】:2013-04-02 18:15:30
【问题描述】:
我在 SO 中搜索了以下一些查询,但找不到与我的搜索相匹配的内容,我在IN、INNER JOIN 和LEFT JOIN 之间有点迷失写信他们。
当前数据库关系
1.通过标签获取项目
TAG.url 是从$_GET 得到的字符串,所以不是 INT id。
例如,使用 url mydomain/items/tag1+tag2/,我们将有以下请求。
对于一个简单的标签,但对于两个或更多标签,以下似乎在 mySQL 中不起作用:
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 和ON 更好的方法?
2。获取其他标签的相关标签
这里我想获取标签列表和匹配其他标签的项目数。
例如,让我们想象以下灯具:
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
如何得到这个结果?
编辑
我尝试了以下似乎可行的方法:
SELECT
COUNT(id_item) AS 'nb_item',
TAG.url AS 'tag_url'
FROM ITEM_TAG, TAG
WHERE
url NOT IN ('tag1','tag2')
AND id_item IN
(
SELECT id_item FROM ITEM_TAG, TAG
WHERE url IN ('tag1','tag2') AND id_tag=id
)
AND id_tag=id
GROUP BY TAG.id ORDER BY nb_item DESC
任何优化此的想法或建议都将受到极大的欢迎。
【问题讨论】:
-
第一个可以用子查询完成....... Select id,title,content from Item where id in(select id_item from Item_tag where id_tag in(select id from Tag where url in('tag1','tag2')))
-
这是比 Andomar 回答更好的方法吗?
-
我认为加入会比这花费更多的时间和空间.....这就是为什么我给出了子查询的解决方案
-
@Jatin Khurana 好的,谢谢,您有第二个解决方案吗?然后,请将其发布为答案。