首页 > 数据库 > mysql教程 > 如何在 SQL 中选择包含所有指定体育项目的商品?

如何在 SQL 中选择包含所有指定体育项目的商品?

Barbara Streisand
发布: 2024-12-24 18:23:11
原创
304 人浏览过

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

“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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板