Heim >Datenbank >MySQL-Tutorial >Wie wähle ich in SQL Angebote aus, die alle Sportarten einer bestimmten Gruppe enthalten?

Wie wähle ich in SQL Angebote aus, die alle Sportarten einer bestimmten Gruppe enthalten?

Barbara Streisand
Barbara StreisandOriginal
2024-12-24 18:23:11309Durchsuche

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

"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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn