在我們的資料庫中,我們有三個表:優惠、 sports,以及連接表Offers_sports。我們想要檢索包含一組給定體育項目的優惠,要求必須存在所有指定的體育項目,但也可能包含其他體育項目。
例如,考慮以下優惠:
如果我們查詢包含“趴板運動”和“衝浪”的優惠,我們預計會收到“中度”和“全部”,但不會收到“輕度”。但是,我們目前的查詢:
Offer.joins(:sports) .where(sports: { name: ["Bodyboarding", "Surfing"] }) .group("sports.name") .having("COUNT(distinct sports.name) = 2")
以及 SQL 等效項:
SELECT "offers".* FROM "offers" INNER JOIN "offers_sports" ON "offers_sports"."offer_id" = "offers"."id" INNER JOIN "sports" ON "sports"."id" = "offers_sports"."sport_id" WHERE "sports"."name" IN ('Bodyboarding', 'Surfing') GROUP BY sports.name HAVING COUNT(distinct sports.name) = 2;
不傳回任何結果。
為了修正這個問題,我們將查詢修改為group by優惠ID 而不是運動名稱:
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;
或ActiveRecord:
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
此修改可確保我們將結果進行適當分組並應用必要的篩選標準來檢索包含指定體育項目的所需優惠。
以上是如何以多對多關係查詢包含一組特定運動項目的商品?的詳細內容。更多資訊請關注PHP中文網其他相關文章!