Vous pouvez joindre la valeur "enum" pour chaque colonne. (Cela semble être la principale chose qui vous manque.)
Dans le WHERE
clause, vous pouvez ensuite filtrer les éléments qui doivent être égaux à 'TRUE'
.
Utilisez un ORDER BY
pour les choses qui sont 'MAYBE'
. Comparez-les à 'TRUE'
et convertir cette comparaison en un integer
. Additionnez les résultats de ces comparaisons castées et triez par cette somme décroissante.
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;
Note latérale :Postgres propose des énumérations comme types de données lui-même. Vous pouvez modifier le schéma de la table de lieu pour les utiliser, les jointures ne seront alors pas nécessaires.