SQL - 查找所有相关标签?

时间:2011-03-18 16:47:39

标签: sql relationship tagging

我有一个如下所示的关系标签表。所有三个tag_id(1,2,3)都存在关系node_id“1”。

CREATE TABLE IF NOT EXISTS `relation` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `tag_id` int(10) unsigned NOT NULL,
  `node_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ;

INSERT INTO `relation` (`id`, `tag_id`, `node_id`) VALUES
(1, 1, 1),
(2, 2, 1),
(3, 3, 1),
(4, 4, 1),
(5, 1, 2),
(6, 3, 2),
(7, 4, 2),
(8, 5, 2),
(9, 1, 3),
(10, 3, 3),
(11, 5, 3),
(12, 6, 3);

使用tag_id“1”作为起点,如何获得按出现次数排序的所有标签的列表?例如,tag_id“3”存在于所有三个node_id记录中 - 而tag_id 4仅存在两次(node_id 1& 2)。

结果应如下所示:

tag_id  count
3       3
4       2
5       2
6       1
2       1

更新:抱歉,我没有解释得足够好。当我说“tag_id”1“作为起点”时,我的意思是如果我搜索到tag_id的关系 - 我怎么能按出现顺序排序呢?

我想找到所有与tag_id相关的tag_id,一个按count排序。这将允许我查看与tag_id 1一起使用的所有tag_id数字。继续上面的示例 - tag_id“3”应该是具有tag_id 1的node_id最常用的tag_id。

更新2:我想我找到了answer here

SELECT tag_id, COUNT(*) as count FROM relation
WHERE tag_id != 1 AND node_id IN
(
    SELECT node_id FROM relation WHERE tag_id = 1
)
GROUP BY tag_id ORDER BY count DESC LIMIT 0,10

这种方法比LEFT JOIN更好吗?我能做些什么来提高它的速度吗?

2 个答案:

答案 0 :(得分:4)

select tag_id, Count(*) as TagCount
from relation
where tag_id <> 1
group by tag_id
order by Count(*) desc

答案 1 :(得分:0)

这会有用吗?

SELECT tag_id, COUNT(*)
FROM relation
GROUP BY tag_id
ORDER BY COUNT(*) desc