Maison > base de données > tutoriel mysql > Comment récupérer des enregistrements contenant l'ensemble d'un ensemble de valeurs donné (mais potentiellement plus) à l'aide de jointures SQL ?

Comment récupérer des enregistrements contenant l'ensemble d'un ensemble de valeurs donné (mais potentiellement plus) à l'aide de jointures SQL ?

Linda Hamilton
Libérer: 2024-12-17 14:35:12
original
845 Les gens l'ont consulté

How to Retrieve Records Containing All of a Given Set of Values (But Potentially More) Using SQL Joins?

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;
Copier après la connexion

Considérations :

  • La clé primaire de la table d'offre (o.id) est utilisée pour le regroupement assurez-vous que chaque offre est comptée une fois.
  • GROUP BY peut être utilisé pour regrouper les enregistrements sans utiliser DISTINCT dans le décompte. opération.
  • La clause HAVING filtre les résultats groupés pour inclure uniquement les offres répondant aux critères souhaités (dans ce cas, avoir deux sports spécifiques).

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
Copier après la connexion

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")
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal