Maison > base de données > tutoriel mysql > Comment sélectionner des offres contenant l'ensemble d'un ensemble de sports spécifié en SQL ?

Comment sélectionner des offres contenant l'ensemble d'un ensemble de sports spécifié en SQL ?

Barbara Streisand
Libérer: 2024-12-24 18:23:11
original
304 Les gens l'ont consulté

How to Select Offers Containing All of a Specified Set of Sports in SQL?

"SQL où l'ensemble joint doit contenir toutes les valeurs mais peut en contenir davantage"

Comprendre l'exigence

Considérez trois tables liées : offres, sports et offres_sports, jointes via des relations has_and_belongs_to_many. L'objectif est de sélectionner des offres qui incluent un éventail spécifié de sports, les offres devant contenir tous les sports spécifiés mais pouvant comporter des sports supplémentaires.

Solution potentielle

Une L'approche consiste à utiliser une combinaison de clauses JOIN, WHERE, GROUP BY et HAVING pour filtrer les résultats en fonction des conditions requises. Plus précisément :

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

Cette requête rejoint d'abord les trois tables pour récupérer les offres et leurs sports associés. La clause WHERE limite la recherche aux sports portant des noms spécifiés. La clause GROUP BY regroupe les résultats par ID d'offre et la clause HAVING garantit que seules les offres contenant tous les sports spécifiés sont sélectionnées.

Implémentation ActiveRecord améliorée

L'ActiveRecord fourni La solution peut être affinée davantage pour améliorer l'efficacité :

class Offer < ActiveRecord::Base
  has_and_belongs_to_many :sports

  def self.includes_sports(*sport_names)
    joins(:sports)
      .where(sports: { name: sport_names })
      .group('offers.id')
      .having("count(*) = ?", sport_names.size)
  end
end
Copier après la connexion

Cette méthode utilise le chaînage pour effectuer les opérations nécessaires, notamment JOIN, WHERE, GROUP BY et HAVING, en une seule requête. Il simplifie également la clause HAVING en utilisant un espace réservé de point d'interrogation (?) pour transmettre dynamiquement la valeur de comptage attendue.

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