Du kan slå samman "enum"-värdet för varje kolumn. (Det verkar vara det viktigaste du saknar.)
I WHERE
klausul kan du sedan filtrera efter de saker som måste vara lika med 'TRUE'
.
Använd en ORDER BY
för de saker som är 'MAYBE'
. Jämför dem med 'TRUE'
och kasta den jämförelsen till ett integer
. Summera resultaten av de gjorda jämförelserna och sortera efter den summan fallande.
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;
Sidanteckning:Postgres erbjuder enums som datatyper själv. Du kan ändra lokalbordets schema för att använda dessa, då skulle anslutningarna inte vara nödvändiga.