"SQL, bei dem die verknüpfte Menge alle Werte enthalten muss, aber möglicherweise mehr enthält"
Verstehen der Anforderung
Betrachten Sie drei verwandte Tabellen: Angebote, Sportarten und Angebote_Sportarten, verbunden durch has_and_belongs_to_many-Beziehungen. Das Ziel besteht darin, Angebote auszuwählen, die eine bestimmte Auswahl an Sportarten umfassen, wobei die Angebote alle angegebenen Sportarten enthalten müssen, aber möglicherweise zusätzliche Sportarten umfassen.
Potenzielle Lösung
Eine Der Ansatz besteht darin, eine Kombination aus JOIN-, WHERE-, GROUP BY- und HAVING-Klauseln zu verwenden, um die Ergebnisse basierend auf den erforderlichen Bedingungen zu filtern. Im Einzelnen:
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;
Diese Abfrage verknüpft zunächst die drei Tabellen, um Angebote und die zugehörigen Sportarten abzurufen. Die WHERE-Klausel beschränkt die Suche auf Sportarten mit angegebenen Namen. Die GROUP BY-Klausel gruppiert die Ergebnisse nach Angebots-ID und die HAVING-Klausel stellt sicher, dass nur Angebote ausgewählt werden, die alle angegebenen Sportarten enthalten.
Verbesserte ActiveRecord-Implementierung
Der bereitgestellte ActiveRecord Die Lösung kann weiter verfeinert werden, um die Effizienz zu steigern:
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
Diese Methode verwendet Verkettung, um die erforderlichen Vorgänge auszuführen, einschließlich JOIN, WHERE, GROUP BY und HAVING in einer einzigen Abfrage. Außerdem wird die HAVING-Klausel vereinfacht, indem ein Fragezeichen-Platzhalter (?) verwendet wird, um den erwarteten Zählwert dynamisch zu übergeben.
Das obige ist der detaillierte Inhalt vonWie wähle ich in SQL Angebote aus, die alle Sportarten einer bestimmten Gruppe enthalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!