Puoi unire il valore "enum" per ogni colonna. (Sembra essere la cosa principale che ti manca.)
Nel WHERE
clausola puoi quindi filtrare per le cose che devono essere uguali a 'TRUE'
.
Usa un ORDER BY
per le cose che sono 'MAYBE'
. Confrontali con 'TRUE'
e lancia quel confronto su un integer
. Somma i risultati di quei confronti espressi e ordina in base alla somma decrescente.
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;
Nota a margine:Postgres offre le enumerazioni come tipi di dati stessi. Potresti modificare lo schema della tabella delle sedi per utilizzarli, quindi i join non sarebbero necessari.