sql >> Database teknologi >  >> RDS >> PostgreSQL

Brug af UNNEST med en JOIN

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 id 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 . 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.



  1. at ændre til funktion i R-pakken og installere på Ubuntu

  2. Arbejde med Java Data i Alteryx

  3. 4 tips til opsætning af dine SQL Server-advarsler

  4. Mysql returnerer mere end én række