sql >> Databasteknik >  >> RDS >> PostgreSQL

Använder UNNEST med en JOIN

Tekniskt sett kan din fråga fungera så här (inte helt säker på syftet med denna fråga):

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 verkar för mig att du är på väg åt fel håll här. Normalt skulle man ta bort den redundanta arrayen taglist och behålla det normaliserade databasschemat. Då borde din ursprungliga fråga fungera bra, bara förkortad syntax med 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;

Retsa fram mysteriet

<rant> Grundorsaken till dina "olika resultat" är den olyckliga namnkonventionen som vissa intellektuellt utmanade ORMs påtvinga människor.
Jag talar om id som kolumnnamn. Använd aldrig detta antimönster i en databas med mer än en tabell. Okej, det betyder i princip alla databas. Så fort du går med i ett gäng bord (det är vad du gör i en databas) får du ett gäng kolumner som heter id . Fullständigt meningslöst.
ID-kolumnen i en tabell med namnet tag ska vara tag_id (såvida det inte finns ett annat beskrivande namn). Aldrig id .</rant>

Din fråga räknar oavsiktligt tags istället för 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;

Det borde fungera så här:

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;

Jag lade också till tillbaka DISTINCT till din count() som försvann på vägen i din fråga.



  1. Utforska MySQL Binlog Server – Ripple

  2. MySQL-villkor från flera rader

  3. Uppdaterar PHP.ini på en GoDaddy-värdwebbplats

  4. Oracle-procedur eller jobb för att automatiskt kopiera data från ett schema till ett annat baserat på tidslinjen