Подсчет того, сколько раз отношение указывает на один и тот же ключ

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: тег2 Ресурс 4: тег1

Запрос должен вывести: 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?


person Lars Hansen    schedule 21.04.2011    source источник


Ответы (3)


Используйте 1_

а не 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
person ypercubeᵀᴹ    schedule 21.04.2011
comment
Ах. Я этого не знал, но в этом есть смысл! Спасибо за предложение. - person Lars Hansen; 21.04.2011

Вы выполняете SUM для ID, а не COUNT.

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

person Paul Alan Taylor    schedule 21.04.2011
comment
Чувак, такие ошибки случаются со всеми нами. Я потерял счет времени, когда я делал логическую операцию, прямо противоположную тому, что намеревался :) - person Paul Alan Taylor; 21.04.2011

Похоже, ваша проблема может быть связана с тем, что вы выполняете SUM вместо COUNT.

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

вместо

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

должен сделать это.

person Naraen    schedule 21.04.2011