SQL - Найти все связанные теги? - PullRequest
1 голос
/ 18 марта 2011

У меня есть таблица тегов отношений, как показано ниже. Отношение tag_id «1» существует для всех трех node_id (1,2,3).

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, используемые вместе с tag_id 1. Продолжая приведенный выше пример, tag_id «3» должен быть наиболее часто используемым tag_id для node_ids с tag_id 1.

Обновление 2: Мне кажется, я нашел ответ здесь .

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

Этот метод лучше, чем ЛЕВОЕ СОЕДИНЕНИЕ? Что я могу сделать, чтобы улучшить его скорость?

Ответы [ 2 ]

4 голосов
/ 18 марта 2011
select tag_id, Count(*) as TagCount
from relation
where tag_id <> 1
group by tag_id
order by Count(*) desc
0 голосов
/ 18 марта 2011

это будет работать?

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