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.