2011-03-18 86 views
1

我有一個像下面這樣的關係標記表。所有三個node_id(1,2,3)都存在「1」的關係tag_idSQL - 查找所有相關的標籤?

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?我能做些什麼來提高速度嗎?

+2

'select tag_id,count(*)from relation where tag_id <> 1 group by tag_id'?它會返回你想要的結果,但我不確定節點在哪裏進入。 – 2011-03-18 16:52:02

回答

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

+1,正確和第一。 – 2011-03-18 16:56:03

+0

+1好開始,但是這只是簡單地對錶中的所有記錄排除* tag_id 1除外*我正在查找與* tag_id 1的記錄相關的記錄。 – Xeoncross 2011-03-18 17:11:34

+0

行如何相互關聯? – 2011-03-18 17:18:11

0

這項工作?

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