Anda dapat menggabungkan nilai "enum" untuk setiap kolom. (Sepertinya itu hal utama yang Anda lewatkan.)
Dalam WHERE
klausa Anda kemudian dapat memfilter untuk hal-hal yang harus sama dengan 'TRUE'
.
Gunakan ORDER BY
untuk hal-hal yang 'MAYBE'
. Bandingkan dengan 'TRUE'
dan berikan perbandingan itu ke integer
. Jumlahkan hasil perbandingan yang dicor dan urutkan berdasarkan jumlah itu secara menurun.
SELECT v.venue_name
FROM venue_table v
INNER JOIN response_enum_table rp
ON rp.id = v.parking
INNER JOIN response_enum_table rd
ON rd.id = v.decorations
INNER JOIN response_enum_table rh
ON rh.id = v.hotel
-- INNER JOIN response_enum_table rx
-- ON rx.id = v.x
-- INNER JOIN response_enum_table ry
-- ON ry.id = v.y
-- ...
WHERE rh.value = 'TRUE'
-- AND rx.value = 'TRUE'
-- ...
ORDER BY (rp.value = 'TRUE')::integer
-- + (ry.value = 'TRUE')::integer
-- ...
DESC;
Catatan tambahan:Postgres menawarkan enum sebagai tipe data itu sendiri. Anda dapat mengubah skema tabel venue untuk menggunakan ini, maka penggabungan tidak diperlukan.