2013-05-17 3 views
4

Итак, у меня есть конкретный запрос, который я пытаюсь настроить немного. Потребности в проекте немного изменились, и я не уверен, как подойти к этому.mysql query с предложением HAVING COUNT

У меня есть 3 таблицы - главная таблица, таблица «теги», а затем таблица ссылок, чтобы привязать теги к основным записям. Морщина заключается в том, что для этой привязки имеется вес, и это используется для суммирования общего веса тегов, связанных с конкретной записью Name в основной таблице. Короче говоря, главная запись может содержать несколько тегов, каждая с другим весом. Текущий запрос суммирует все веса тегов и упорядочивает их на общую сумму всех тегов.

UID | Name 
----------------- 
123 | Robert 


UID | Tag_Name 
----------------- 
1 | Name_One 
2 | Name_Two 


Tag_ID | Name_ID | Weight 
----------------------------- 
2  | Name_One | 2 
1  | Name_Two | 3 
1  | Name_One | 5 

В настоящее время, я построил это, что совершает этот штраф, где 2,1 представляет собой строку из тега идентификаторами, что я ищу, чтобы соответствовать:

SELECT person.id, 
    SUM(linkage.weight) AS total_weight 
    FROM (person) 
    INNER JOIN linked_tags AS linkage 
    ON linkage.track_id = person.id AND linkage.tag_id IN (2,1) 
    GROUP BY person.id 
    HAVING COUNT(DISTINCT linkage.tag_id)=1 
    ORDER BY total_weight DESC 

Я хочу продлить это для другой использование. Прямо сейчас теги id, которые передаются как строка, являются субтрактивными. Он находит только совпадения, когда оба идентификатора тега существуют для определенного идентификатора человека. Если бы мне захотелось передать еще одну строку id, где, если ANY-идентификатор пользователя равен ЛЮБОЙ из идентификатора тега из этой строки, за которым следует текущая строка с надбавкой id, плюс суммируйте вес этих тегов, как я могу это сделать ?

ответ

2

Я считаю, что правильный having пункт для запроса:

HAVING COUNT(DISTINCT linkage.tag_id)=2 

Ваша версия находит точно 1 тег.

Следующая версия запроса имеет метки 3 и 4 являются необязательными:

SELECT person.id, SUM(linkage.weight) AS total_weight 
    FROM person INNER JOIN 
     linked_tags AS linkage 
     ON linkage.track_id = person.id AND 
      linkage.tag_id IN (2, 1, 3, 4) 
    GROUP BY person.id 
    HAVING COUNT(DISTINCT case when linkage.tag_id in (1, 2) then linkage.tag_id end) = 2 
    ORDER BY total_weight DESC ; 

Большой разницей является использованием case заявления в пункте count(distinct).

+0

и конец) = 2, является ли счетчик количества чисел в части (1,2) непосредственно перед этим? – jpea

+0

@jpea. , , Да, это счет. Ваш исходный запрос искал только одно совпадение в этом наборе. Вы хотите их всех, поэтому вам нужно «2», а не «1». –

+0

Извините, еще один вопрос - так что (2,1,3,4) часть - это то, что ВСЕ идентификатора тега независимо от того, должны ли они быть субтрактивными? – jpea

Смежные вопросы