“SQL where 连接集必须包含所有值,但可能包含更多值”
理解要求
考虑三个相关表:offers、sports 和 Offers_sports,通过具有并属于多个关系。目标是选择包含指定运动项目的商品,其中商品必须包含所有指定的运动项目,但可能还有其他运动项目。
潜在解决方案
一个方法是使用 JOIN、WHERE、GROUP BY 和 HAVING 子句的组合来根据所需条件过滤结果。具体来说:
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;
此查询首先连接三个表以检索优惠及其关联的体育项目。 WHERE 子句将搜索限制为具有指定名称的体育项目。 GROUP BY 子句按商品 ID 对结果进行分组,HAVING 子句确保仅选择包含所有指定运动的商品。
改进的 ActiveRecord 实现
提供的 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
此方法使用链接来执行单个查询中的必要操作,包括 JOIN、WHERE、GROUP BY 和 HAVING。它还通过使用问号 (?) 占位符动态传递预期计数值来简化 HAVING 子句。
以上是如何在 SQL 中选择包含所有指定体育项目的商品?的详细内容。更多信息请关注PHP中文网其他相关文章!