SQL où l'ensemble joint doit contenir toutes les valeurs mais peut en contenir plus
Étant donné un ensemble de tables avec des relations, l'objectif est de récupérer des enregistrements à partir d'une table (offres) qui inclut un tableau donné de valeurs mais peut également avoir des valeurs supplémentaires.
En SQL, cela peut être réalisé en utilisant une combinaison de jointures, le regroupement et la clause HAVING. La requête suivante accomplit cette tâche :
SELECT o.* FROM sports s JOIN offers_sports os ON os.sport_id = s.id JOIN offers o ON os.offer_id = o.id WHERE s.name IN ('Bodyboarding', 'Surfing') GROUP BY o.id -- !! HAVING count(*) = 2;
Considérations :
Implémentation d'ActiveRecord :
def self.includes_sports(*sport_names) joins(:sports) .where(sports: { name: sport_names }) .group('offers.id') .having("count(*) = ?", sport_names.size) end
Avec cette méthode, vous pouvez rechercher des offres qui incluent les noms de sports spécifiés dans Enregistrement actif :
offers = Offer.includes_sports("Bodyboarding", "Surfing")
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!