Можете да присъедините стойността "enum" за всяка колона. (Изглежда това е основното нещо, което пропускате.)
В WHERE
след това можете да филтрирате за нещата, които трябва да са равни на 'TRUE'
.
Използвайте ORDER BY
за нещата, които са 'MAYBE'
. Сравнете ги с 'TRUE'
и прехвърлете това сравнение към integer
. Сумирайте резултатите от тези сравнения и сортирайте по тази сума в низходящ ред.
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;
Странична бележка:Postgres сам предлага enum като типове данни. Бихте могли да промените схемата на таблицата на мястото, за да ги използвате, тогава обединенията няма да са необходими.