Puede unir el valor "enumeración" para cada columna. (Eso parece ser lo principal que te estás perdiendo).
En el WHERE
puede filtrar por las cosas que tienen que ser iguales a 'TRUE'
.
Usa un ORDER BY
por las cosas que son 'MAYBE'
. Compáralos con 'TRUE'
y convierta esa comparación en un integer
. Sume los resultados de las comparaciones realizadas y ordene por esa suma de forma descendente.
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 al margen:Postgres ofrece enumeraciones como tipos de datos en sí. Puede cambiar el esquema de la tabla del lugar para usar estos, entonces las uniones no serían necesarias.