PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Menggunakan UNNEST dengan JOIN

Secara teknis, kueri Anda mungkin berfungsi seperti ini (tidak sepenuhnya yakin tentang tujuan kueri ini):

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;

Namun, bagi saya tampaknya Anda menuju ke arah yang salah di sini. Biasanya seseorang akan menghapus array taglist yang berlebihan dan pertahankan skema database yang dinormalisasi. Maka kueri asli Anda akan berfungsi dengan baik, hanya menyingkat sintaks dengan 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;

Mengungkap misteri

<rant> Akar penyebab "hasil yang berbeda" Anda adalah konvensi penamaan yang tidak menguntungkan yang beberapa secara intelektual menantang ORM memaksakan pada orang.
Saya berbicara tentang id sebagai nama kolom. Jangan pernah menggunakan anti-pola ini dalam database dengan lebih dari satu tabel. Benar, pada dasarnya itu berarti apa saja basis data. Segera setelah Anda bergabung dengan sekelompok tabel (itulah yang Anda lakukan dalam database) Anda berakhir dengan sekelompok kolom bernama id . Sama sekali tidak berguna.
Kolom ID dari tabel bernama tags harus tag_id (kecuali ada nama deskriptif lain). Jangan pernah id .</rant>

Kueri Anda secara tidak sengaja menghitung tags alih-alih 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;

Ini harus bekerja dengan cara ini:

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;

Saya juga menambahkan kembali DISTINCT ke count() . Anda yang tersesat dalam kueri Anda.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menjalankan SQL mentah dalam migrasi Django

  2. Izinkan akses ke Postgresql dari komputer mana pun

  3. Bagaimana saya bisa mendapatkan hasil dari entitas JPA yang dipesan berdasarkan jarak?

  4. Haruskah saya menyertakan SELECT dalam transaksi?

  5. Penerapan dan Penskalaan PostgreSQL v13 dengan ClusterControl 1.8.2