Технически вашата заявка може да работи по следния начин (не съм напълно сигурен за целта на тази заявка):
SELECT 9 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id AS tag_id
FROM (
SELECT unnest(m.taglist) AS tag_id
FROM mentions m
WHERE m.search_id = 3
AND 9 = ANY (m.taglist)
) m
JOIN tags t USING (tag_id) -- assumes tag.tag_id!
GROUP BY t.parent_id;
Струва ми се обаче, че тук вървите в грешна посока. Обикновено човек би премахнал излишния масив taglist
и запазите нормализираната схема на базата данни. Тогава оригиналната ви заявка трябва да служи добре, само съкратете синтаксиса с псевдоними:
SELECT 9 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id AS tag_id
FROM mentions m
JOIN taggings mt ON mt.mention_id = m.id
JOIN tags t ON t.id = mt.tag_id
WHERE 9 = ANY (m.taglist)
AND m.search_id = 3
GROUP BY t.parent_id;
Разгадайте мистерията
<rant>
Основната причина за вашите „различни резултати“ е неудачната конвенция за именуване, която някои интелектуално оспорват ORM наложи на хората.
Говоря за
като име на колона. Никога не използвайте този анти-модел в база данни с повече от една таблица. Точно така, това означава основно всеки база данни. Веднага щом се присъедините към група маси (това правите в база данни) завършвате с куп колони с имена idid
. Напълно безсмислено.
Колоната ID на таблица с име tag
трябва да бъде tag_id
(освен ако няма друго описателно име). Никога id
.</rant>
Вашата заявка неволно брои tags
вместо mentions
:
SELECT 25 AS keyword_id, count(m.id) AS total, t.parent_id AS tag_id
FROM (
SELECT unnest(m.taglist) AS id
FROM mentions m
WHERE m.search_id = 4
AND 25 = ANY (m.taglist)
) m
JOIN tags t USING (id)
GROUP BY t.parent_id;
Трябва да работи по следния начин:
SELECT 25 AS keyword_id, count(DISTINCT m.id) AS total, t.parent_id
FROM (
SELECT m.id, unnest(m.taglist) AS tag_id
FROM mentions m
WHERE m.search_id = 4
AND 25 = ANY (m.taglist)
) m
JOIN tags t ON t.id = m.tag_id
GROUP BY t.parent_id;
Също така добавих обратно DISTINCT
към вашия count()
които се изгубиха по пътя във вашата заявка.