Почему мой запрос не дает особых результатов? - PullRequest
0 голосов
/ 19 марта 2020

У меня следующий запрос с group by и having плюс count. Он должен возвращать только те строки, у которых есть столбцы, указанные в предложении group by с количеством, указанным как having count x.

. Я думаю, что следующий запрос должен быть правильным:

@articles = Article.joins(:taggings)
                   .where(taggings: { tag_id: @article_tags_ids, taggable_type: "Article"})
                   .group('articles.id')
                   .having("count(taggings.tag_id) = ?", @article_tags_count)

В этом В этом случае он должен возвращать только те статьи, которые имеют те и те теги, которые искал пользователь, и не более.

Схема взята из этого урока: https://cobwwweb.com/rails-has-many-through-polymorphic-association

Создает это SQL

SELECT
  `articles`.* 
FROM
  `articles` 
INNER JOIN `taggings` 
  ON `taggings`.`taggable_id` = `articles`.`id` 
  AND `taggings`.`taggable_type` = 'Article' 
WHERE
  `taggings`.`tag_id` IN (1, 3) 
  AND `taggings`.`taggable_type` = 'Article' 
GROUP BY
  articles.id 
HAVING
  (count(taggings.tag_id) = 2) 
LIMIT 11

1 Ответ

0 голосов
/ 07 апреля 2020

Решение состоит в следующем: SQL Запрос не с одним, а с двумя объединениями в таблице соединений. Я не знаю, какое это существенное различие, но, очевидно, для базы данных оно действительно имеет одно значение, даже если он может сопоставлять статьи с тегами уже с одним join.

SELECT  
`articles`.*
FROM `articles`
JOIN `taggings` 
ON `articles`.`id` = `taggings`.`taggable_id` 
JOIN `tags` ON `taggings`.`taggable_id` = `tags`.id 
WHERE `tags`.`id` in (1,2,3) 
GROUP BY `articles`.id 
HAVING( COUNT(`tags`.`id`) = 3);

Таким образом, когда у вас есть две статьи, article-one и article-two, где article-one совпадает с tag1, tag2, tag3 и article-two также совпадают с tag1, tag2, tag3 и над этим tag4, запрос возвращает только article-one. Соединение - это «это» and «не более», а не or

Ваш

vonSpotz

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...