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