PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Recherche des données de base de données qui correspondent le mieux aux réponses des variables utilisateur

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.