Comment former une requête SQL pour un à plusieurs relation?
-
28-09-2019 - |
Question
J'ai deux tables MySQL: house
et features
. Ceci est un site immobilier.
house
a cette structure:
id | address | ... some other fields
features
a cette structure:
id | house_id | feature | value
comme vous pouvez le deviner, une maison peut avoir de multiples fonctionnalités, donc 1:. N relation existe
Maintenant, je suis en œuvre un formulaire de recherche pour les maisons. Je dois filtrer les résultats en fonction des caractéristiques sélectionnées par l'utilisateur.
Exemple de scénario: obtenir toutes les maisons qui ont les caractéristiques garage
et garden
, et une liste des caractéristiques de ces maisons
Quelle serait la meilleure question pour répondre à mes besoins? Je ne suis pas familier avec les opérations de jointure, donc je besoin de votre aide!
(EN OPTION) Si vous pouvez fournir une solution spécifique-cadre Yû, ce serait génial:)
La solution
SELECT *
FROM HOUSE H JOIN FEATURES F ON H.HOUSE_ID = F.HOUSE_ID
WHERE FEATURE IN ('GARDEN','GARAGE');
Autres conseils
Si vous avez besoin uniquement les colonnes de la table Maison :
SELECT * de maison où ID dans (ID SELECT de CARACTÉRISTIQUES où IN FEATURE ( 'garden', 'GARAGE'));
Si vous avez besoin de détails entiers:
SELECT * DE PRESTATIONS H JOIN F = ON H.HOUSE_ID F.HOUSE_ID OÙ EN FONCTION ( 'JARDIN', 'GARAGE');
Vous n'avez pas besoin de se joindre manuellement si vous utilisez Yii.
Il est plus facile si vous utilisez MySQL (sur SQLite) et si vous utilisez des tables InnoDB (sur les tables MyISAM).
Vous devez créer une clé étrangère de Caractéristiques (colonne house_id) à Maisons (colonne house_id)
Si vous construisez votre modèle à l'aide Gii, il va créer la fonction « relation » pour vous automatiquement.
Ensuite, dans Yii, vous appelleriez Maison-> propose d'obtenir un tableau de lignes de fonction.
Vous pouvez passer un objet CDbCriteria dans l'appel Fill () pour filtrer les maisons que l'utilisateur a sélectionné.