Teknisk set kan din forespørgsel fungere sådan her (ikke helt sikker på formålet med denne forespørgsel):
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;
Men det forekommer mig, at du er på vej i den forkerte retning her. Normalt ville man fjerne det redundante array taglist og behold det normaliserede databaseskema. Så skulle din oprindelige forespørgsel fungere godt, kun forkortet syntaksen med aliaser:
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;
Opklar mysteriet
Grundårsagen til dine "forskellige resultater" er den uheldige navnekonvention, som nogle intellektuelt udfordrede ORM'er påtvinge folk.
Jeg taler om som kolonnenavn. Brug aldrig dette anti-mønster i en database med mere end én tabel. Okay, det betyder stort set enhver database. Så snart du tilmelder dig en masse borde (det er hvad du gør i en database) ender du med en masse kolonner med navnet id id . Fuldstændig meningsløst.
ID-kolonnen i en tabel med navnet tag skal være tag_id (medmindre der er et andet beskrivende navn). Aldrig id .
Din forespørgsel tæller utilsigtet tags i stedet for omtaler :
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;
Det burde fungere på denne måde:
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;
Jeg tilføjede også DISTINCT tilbage til din count() der forsvandt undervejs i din forespørgsel.