Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Memilih Tawaran yang Mengandungi Semua Set Sukan Tertentu dalam SQL?

Bagaimana untuk Memilih Tawaran yang Mengandungi Semua Set Sukan Tertentu dalam SQL?

Barbara Streisand
Lepaskan: 2024-12-24 18:23:11
asal
304 orang telah melayarinya

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

"SQL di mana set bercantum mesti mengandungi semua nilai tetapi mungkin mengandungi lebih banyak"

Memahami Keperluan

Pertimbangkan tiga jadual yang berkaitan: tawaran, sukan dan tawaran_sukan, disertai mempunyai_dan_mempunyai_banyak hubungan. Matlamatnya adalah untuk memilih tawaran yang termasuk pelbagai sukan yang ditentukan, di mana tawaran mesti mengandungi semua sukan yang dinyatakan tetapi mungkin mempunyai sukan tambahan.

Potensi Penyelesaian

Satu pendekatan adalah menggunakan gabungan klausa JOIN, WHERE, GROUP BY, dan HAVING untuk menapis keputusan berdasarkan syarat yang diperlukan. Khususnya:

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;
Salin selepas log masuk

Pertanyaan ini mula-mula menyertai tiga jadual untuk mendapatkan semula tawaran dan sukan yang berkaitan dengannya. Klausa WHERE mengehadkan carian kepada sukan dengan nama tertentu. Klausa GROUP BY mengumpulkan hasil mengikut ID tawaran, dan klausa HAVING memastikan bahawa hanya tawaran yang mengandungi semua sukan tertentu dipilih.

Pelaksanaan ActiveRecord yang Diperbaiki

ActiveRecord yang disediakan penyelesaian boleh diperhalusi lagi untuk meningkatkan kecekapan:

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
Salin selepas log masuk

Kaedah ini menggunakan rantaian untuk melaksanakan operasi yang diperlukan, termasuk JOIN, WHERE, GROUP BY, dan HAVING, dalam satu pertanyaan. Ia juga memudahkan klausa HAVING dengan menggunakan tanda soal (?) pemegang tempat untuk melepasi nilai kiraan yang dijangkakan secara dinamik.

Atas ialah kandungan terperinci Bagaimana untuk Memilih Tawaran yang Mengandungi Semua Set Sukan Tertentu dalam SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan