Bạn có thể nối giá trị "enum" cho mỗi cột. (Đó có vẻ là điều chính mà bạn đang thiếu.)
Trong WHERE
sau đó bạn có thể lọc những thứ phải bằng 'TRUE'
.
Sử dụng ORDER BY
cho những thứ là 'MAYBE'
. So sánh chúng với 'TRUE'
và truyền so sánh đó thành một số nguyên integer
. Tính tổng kết quả của các phép so sánh được đúc đó và sắp xếp theo tổng giảm dần.
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;
Lưu ý bên cạnh:Postgres cung cấp enums dưới dạng chính các kiểu dữ liệu. Bạn có thể thay đổi lược đồ của bảng địa điểm để sử dụng những thứ này, khi đó các phép nối sẽ không cần thiết.