PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използване на UNNEST с JOIN

Технически вашата заявка може да работи по следния начин (не съм напълно сигурен за целта на тази заявка):

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;

Струва ми се обаче, че тук вървите в грешна посока. Обикновено човек би премахнал излишния масив taglist и запазите нормализираната схема на базата данни. Тогава оригиналната ви заявка трябва да служи добре, само съкратете синтаксиса с псевдоними:

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;

Разгадайте мистерията

<rant> Основната причина за вашите „различни резултати“ е неудачната конвенция за именуване, която някои интелектуално оспорват ORM наложи на хората.
Говоря за id като име на колона. Никога не използвайте този анти-модел в база данни с повече от една таблица. Точно така, това означава основно всеки база данни. Веднага щом се присъедините към група маси (това правите в база данни) завършвате с куп колони с имена id . Напълно безсмислено.
Колоната ID на таблица с име tag трябва да бъде tag_id (освен ако няма друго описателно име). Никога id .</rant>

Вашата заявка неволно брои tags вместо 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;

Трябва да работи по следния начин:

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;

Също така добавих обратно DISTINCT към вашия count() които се изгубиха по пътя във вашата заявка.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Използване на COALESCE за обработка на NULL стойности в PostgreSQL

  2. Как да увеличим максималните връзки в postgres?

  3. Как мога да спра изпълнението на sql заявка в php?

  4. java enum и postgresql enum

  5. ГРЕШКА:разрешението е отказано за име на таблица за връзка в Postgres, докато се опитва SELECT като потребител само за четене