Você pode juntar o valor "enum" para cada coluna. (Isso parece ser a principal coisa que você está perdendo.)
No
WHERE
cláusula você pode filtrar as coisas que devem ser iguais a 'TRUE'
. Use um
ORDER BY
para as coisas que são 'MAYBE'
. Compare-os com 'TRUE'
e converta essa comparação para um integer
. Some os resultados dessas comparações lançadas e classifique por essa soma 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 lateral:O Postgres oferece enums como tipos de dados em si. Você poderia alterar o esquema da mesa de local para usá-los, então as junções não seriam necessárias.