Możesz dołączyć do wartości „enum” dla każdej kolumny. (To wydaje się być główną rzeczą, której brakuje.)
W WHERE
klauzulę możesz następnie filtrować pod kątem rzeczy, które muszą być równe 'TRUE'
.
Użyj ORDER BY
dla rzeczy, które są 'MAYBE'
. Porównaj je z 'TRUE'
i rzutuj to porównanie na integer
. Zsumuj wyniki tych rzutowanych porównań i posortuj według tej sumy malejąco.
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;
Uwaga dodatkowa:Postgres oferuje same wyliczenia jako typy danych. Możesz zmienić schemat tabeli miejsca spotkań, aby z nich korzystać, wtedy łączenia nie byłyby konieczne.