3 votes

mysql clause AND sur la même colonne plusieurs fois

J'essaie d'extraire les propriétés qui ont plusieurs équipements.

Mais la structure de la table est la suivante : les propriétés sont dans property table et les commodités sont associées à la propriété.

La table des commodités a :

id property_id amenity_name ....

Maintenant, je veux rechercher les équipements qui ont un "parking" et un "ascenseur", etc.

select property_id from amenities where name = 'parking' and name = 'elevator';

Je ne veux pas lancer une requête de jointure pour cela.

Quelqu'un peut-il me sauver dans cette situation ?

8voto

CobaltBlue Points 354

Essayez ça :

SELECT property_id FROM amenities
WHERE amenity_name IN ('parking', 'elevator')
GROUP BY property_id 
HAVING COUNT(amenity_name) >= 2

Voici ce qui se passe...

Tout d'abord, obtenez la liste des propriétés qui possèdent les équipements qui vous intéressent :

SELECT property_id FROM amenities WHERE amenity_name IN ('parking', 'elevator')

Ensuite, réduisez la liste pour n'inclure que les identifiants de propriété qui ont plus d'une commodité. Le regroupement par ID de propriété permet de regrouper les résultats en groupes uniques en fonction de l'ID de propriété à laquelle ils appartiennent. Ensuite, nous comptons simplement le nombre de noms de commodités dans chaque groupe et vérifions s'il est égal ou supérieur à 2.

GROUP BY property_id HAVING COUNT(amenity_name) >= 2

Le code ci-dessus part du principe que le même nom d'agrément ne sera pas associé plusieurs fois à un numéro de propriété. Pour éliminer les problèmes liés à cela, modifiez le paramètre HAVING pour inclure la clause DISTINCT pour éliminer les doublons, mais ne l'ajoutez que si vous en avez besoin.

GROUP BY property_id HAVING COUNT(DISTINCT(amenity_name)) >= 2

5voto

Nicola Cossu Points 18168
select property_id 
from amenities 
where name in ('parking','elevator')
group by property_id
having count(distinct(name)) = 2

1voto

Vivek Parihar Points 939

Essayez ceci :

   scope :amenity_type, lambda {|term|
          where("amenities.name" => term).joins(:amenities).group("amenities.property_id").having("count(amenities.name) >= #{term.size}") unless term.blank?
   }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X