我有一個像下面這樣的關係標記表。所有三個node_id
(1,2,3)都存在「1」的關係tag_id
。SQL - 查找所有相關的標籤?
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」作爲起點,如何獲得所有按發生次數排序的標籤列表?例如,所有三個node_id記錄中都存在tag_id「3」 - 而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 node_ids 1
更新2最常用的TAG_ID:我想我發現一個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?我能做些什麼來提高速度嗎?
'select tag_id,count(*)from relation where tag_id <> 1 group by tag_id'?它會返回你想要的結果,但我不確定節點在哪裏進入。 – 2011-03-18 16:52:02