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