2013-10-03 2 views
0

У меня есть следующий запрос, чтобы вернуть все user_attributes и атрибуты, которые имеют указанный тег:ЗЕЬЕСТА с помощью WHERE IN и HAVING COUNT терпит неудачу

SELECT `user_attributes`.*, `attributes`.* 
FROM `user_attributes` 
INNER JOIN `attributes` ON (`attributes`.`id` = `user_attributes`.`attribute_id`) 
INNER JOIN `user_tags` ON (`attributes`.`id` = `user_tags`.`attribute_id`) 
INNER JOIN `tags` ON (`user_tags`.`tag_id` = `tags`.`id`) 
WHERE `user_attributes`.`user_id` = '1' 
    AND `tags`.`title` IN ('tag1') 

Я хотел бы настроить запрос так, чтобы он находит все значения, имеют 2 метки. На данный момент у меня есть:

SELECT `user_attributes`.* 
FROM `user_attributes` 
INNER JOIN `attributes` ON (`attributes`.`id` = `user_attributes`.`attribute_id`) 
INNER JOIN `user_tags` ON (`attributes`.`id` = `user_tags`.`attribute_id`) 
INNER JOIN `tags` ON (`user_tags`.`tag_id` = `tags`.`id`) 
WHERE `user_attributes`.`user_id` = '1' 
    AND `tags`.`title` IN ('tag1', 'tag2') 
    HAVING (COUNT(DISTINCT `tags`.`title`) = 2) 

Это нарушение, потому что я использую HAVING без GROUP BY?

+1

HAVING следует использовать в сочетании с GROUP BY действительно. MySQL - это единственная база данных, которая будет обрабатывать HAVING без GROUP BY как-то от WHERE –

+0

Спасибо, если вы добавите это как ответ, я его приму. Я помещал GROUP BY в неправильное место и получал синтаксическую ошибку. Необходимо быть перед ИДЕЙ и после ГДЕ И. – xylar

+0

В этом конкретном запросе вам, вероятно, понадобится 'GROUP BY user_attributes.attribute_id' (поскольку вы говорите, что хотите вернуть все user_attributes ...) Но' HAVING' без 'GROUP BY' является допустимым и полезным в других случаях. –

ответ

-1

HAVING следует использовать в комбинации с GROUP BY. MySQL является единственной базой данных, что будет обрабатывать HAVING без GROUP BY как своего рода офф ГДЕ

Некоторые больше доказательств для downvoter ..

MySQL http://www.sqlfiddle.com/#!2/ba8d6/3 (this is WRONG and looks like HAVING IS USED AS WHERE) 
Oracle http://www.sqlfiddle.com/#!4/ba8d6/1 (this is correct ORA-00979: not a GROUP BY expression Oracle is missing the GROUP BY) 
Postgresql http://www.sqlfiddle.com/#!1/ba8d6/2 (this is correct ERROR: column "data.username" must appear in the GROUP BY clause or be used in an aggregate function Postgresql wants to have an GROUP BY