Pro každý sloupec můžete připojit hodnotu "enum". (Zdá se, že to je to hlavní, co vám chybí.)
V WHERE
klauzuli, kterou pak můžete filtrovat podle věcí, které se musí rovnat 'TRUE'
.
Použijte ORDER BY
pro věci, které jsou 'MAYBE'
. Porovnejte je s 'TRUE'
a přenést toto srovnání na integer
. Sečtěte výsledky těchto vsazených srovnání a seřaďte podle tohoto součtu sestupně.
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;
Vedlejší poznámka:Postgres nabízí výčty jako datové typy sám. Můžete změnit schéma tabulky místa konání tak, aby je používala, pak by spojení nebyla nutná.