Подсчет, сколько раз отношение указывает на один и тот же ключ - PullRequest
1 голос
/ 21 апреля 2011
SELECT t.tag_name
FROM tags t
 JOIN resource_tags rt ON rt.tag_id = t.tag_id
 JOIN resource r ON r.resource_id = rt.resource_id
 JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
 JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '1'
GROUP BY t.tag_name

Как вы можете видеть, «посетитель» посещает «ресурс», и связь между ними будет создана в visitor_resource.

В данном «ресурсе» есть пара «тегов» в зависимости от содержимого, и они связаны вместе отношением в resource_tags.

Приведенный выше запрос выводит имена тегов для всехресурсы, которые посетитель посетил.

Теперь я хочу узнать, сколько раз представлен тег.

Рассмотрим следующее: Ресурс 1: тег1, тег2 Ресурс 2: тег1 Ресурс 3: tag2 Ресурс 4: tag1

Запрос должен вывести: tag1, 3 tag2, 2

Я пробовал следующее:

SELECT t.tag_name, SUM(t.tag_id) as cnt
 FROM tags t
 JOIN resource_tags rt ON rt.tag_id = t.tag_id
 JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
 JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '2'
GROUP BY t.tag_name

Но, похоже,исключительно неоправданно большие числа для cnt, не считая этого конкретного пользователя.

Возможно ли это даже с MySQL?

Ответы [ 3 ]

1 голос
/ 21 апреля 2011

Вы делаете СУММУ на ID, а не COUNT.

Вы в основном складываете автоматически сгенерированные значения ваших тегов, что даст вам гораздо более высокий результат, чем простое суммирование вхождений.

1 голос
/ 21 апреля 2011

Похоже, ваша проблема может быть связана с тем, что вы делаете СУММУ вместо СЧЕТЧИКА

SELECT t.tag_name, COUNT(t.tag_id) as cnt

вместо

SELECT t.tag_name, SUM(t.tag_id) as cnt

.

0 голосов
/ 21 апреля 2011

Использование: COUNT(t.tag_id)

а не SUM(t.tag_id).

Также более часто группировать по идентификатору (первичному ключу) и, возможно, быстрее, так как индекс можно использовать для группировки. Тег_имя может не иметь индекса.

SELECT t.tag_name
     , COUNT(t.tag_id) AS cnt
FROM tags t
  JOIN resource_tags rt ON rt.tag_id = t.tag_id
  JOIN visitor_resource vr ON vr.resource_id = rt.resource_id
  JOIN visitor v ON v.visitor_id = vr.visitor_id
WHERE v.visitor_id = '2'
GROUP BY t.tag_id
...