Technicky může váš dotaz fungovat takto (nejste si zcela jisti cílem tohoto dotazu):
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;
Zdá se mi však, že zde jdete špatným směrem. Normálně by se odstranilo nadbytečné pole taglist
a zachovat normalizované schéma databáze. Pak by měl váš původní dotaz dobře posloužit, pouze zkrácenou syntaxi pomocí aliasů:
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;
Odhalte záhadu
<rant>
Hlavní příčinou vašich „odlišných výsledků“ je nešťastná konvence pojmenování, kterou někteří intelektuálně zpochybňují ORM vnucovat lidem.
Mluvím o
jako název sloupce. Nikdy nepoužívejte tento anti-vzor v databázi s více než jednou tabulkou. Správně, to znamená v podstatě jakýkoli databáze. Jakmile se připojíte k hromadě stolů (to je to, co děláte v databázi) skončíte s hromadou sloupců s názvem idid
. Naprosto zbytečné.
Sloupec ID tabulky s názvem tag
by měl být tag_id
(pokud neexistuje jiný popisný název). Nikdy id
.</rant>
Váš dotaz neúmyslně počítá tags
místo 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;
Mělo by to fungovat takto:
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;
Také jsem přidal zpět DISTINCT
k vašemu count()
který se cestou ve vašem dotazu ztratil.