如何将查询结果限制为精确组匹配

2024-03-26

我有一个如下表:

user  | item
-------------
   X  | Apple
   X  | Orange
   X  | Pear
   Y  | Orange
   Y  | Pear
   Z  | Apple
   Z  | Orange

我的目标是有 3 个搜索选项:ANY, ALL(至少),EXACT

Where

  • ANY返回至少搜索过一项的用户列表,因此搜索“Apple” - ANY 将返回 X,Z,搜索“Apple, Orange”- ANY 将返回 X,Y,Z

  • ALL返回搜索了所有项目的用户列表,因此搜索“Apple” - ALL 将返回 X,Z,搜索“Apple, Orange”- ALL 将返回 X,Z

  • EXACT返回搜索了所有项目但没有搜索其他项目的用户列表,因此搜索“Apple”- EXACT 将不会返回任何结果,搜索“Apple,Orange”- EXACT 将返回 Z

我已经解决了前两个问题:

ANY

SELECT user FROM users_items WHERE item IN ($item_array);

ALL

SELECT user FROM users_items WHERE item IN ($item_array) 
GROUP BY user HAVING COUNT(DISTINCT item) = $item_search_count;

但我不知道如何进行精确搜索。我能想到的最好的办法是:

SELECT user FROM users_items WHERE item IN ($item_array) AND
user NOT IN (
     SELECT user FROM users_items WHERE item NOT IN ($item_array)
)
GROUP BY user HAVING COUNT(DISTINCT item) = $item_search_count;

这起初不起作用,因为在真实的数据集中,用户或项目可能为空,但当我将其更新为:

SELECT user FROM users_items WHERE item IN ($item_array) AND
user NOT IN (
     SELECT user FROM users_items WHERE item NOT IN ($item_array) 
     AND user IS NOT NULL AND item IS NOT NULL
)
GROUP BY user HAVING COUNT(DISTINCT item) = $item_search_count;

这可行,但查询速度确实很慢。

有没有更好的方法来查询“所有匹配集合的项目,排除不匹配集合的项目”?


使用魔法group_concat http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat功能:

SELECT user
FROM (
    SELECT user, group_concat(item) as items
    from user_items
    group by 1) x
WHERE items = 'Apple,Orange';

注意:您正在搜索的项目列表(例如'Apple,Orange') 必须按字母顺序排列

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将查询结果限制为精确组匹配 的相关文章

  • 标签系统:Toxi 解决方案问题

    我对标签数据库模式的 Toxi 解决方案感到有点困惑 我正在开发一个系统 用户可以向该系统提交项目 并且这些项目可以具有与其关联的标签 在阅读了 tagchemas 后 我发现 Toxi 解决方案最适合我的需求 但是 我不完全确定我的计划是
  • 在 MySQL 中存储 IPv6 地址

    正如 需要支持 ipv6 的 inet aton 和 inet ntoa 函数 http bugs mysql com bug php id 34037 目前没有用于存储 IPv6 地址的 MySQL 函数 用于存储 插入的推荐数据类型 函
  • 如何在查询中获取 MySQL 状态

    是否可以在 MySQL 查询中使用服务器状态变量 我可以从 显示状态 中看到各种指标 但如何计算派生值 例如查询缓存命中率 show global status like Qcache inserts show global status
  • 根据当前配置,没有映射 Doctrine ORM 实体

    我有一个可疑的问题 我有一组现有的带注释的 Doctrine 实体 它们已在 Symfony2 Doctrine2 项目中成功使用 然而 我目前正在将该项目的一些核心功能隔离到它自己的 Web 框架独立库中 但我似乎无法让这些实体正常运行
  • 如何获取MySQL中最后更新的行的ID?

    如何使用 PHP 获取 MySQL 中最后更新行的 ID 我找到了这个问题的答案 SET update id 0 UPDATE some table SET column name value id SELECT update id id
  • 如何通过python将python字典存储到mysql数据库中

    我试图通过将字典转换为字符串然后尝试插入来将以下字典存储到 mysql DB 中 但出现以下错误 如何解决这个问题 或者有其他方法将字典存储到 mysql DB 中吗 dic office component office Word2010
  • 使用 mysql_real_escape_string() 时出现访问被拒绝错误

    我试图在数据进入我的数据库之前转义一些数据 但我不断收到此错误 Warning mysql real escape string Access denied for user 现在 这通常表明我尚未连接到数据库 它还声明 使用密码 NO 我
  • NodeJs util.promisify 不是一个函数

    我正在尝试 promisify mysql 函数 但是当我运行它时 控制台显示此错误util Promisify is not a function 这是我的代码 var util require util var mysql requir
  • 如何使用 SQLAlchemy 进行“mysql 解释”

    我有一个像这样的sql DBSession query Model filter 我想用这个 sql 来解释SQLAlchemy 你想要将 SQLAlchemy 查询编译为字符串 https docs sqlalchemy org faq
  • 用于从 PHP 更新实时
  • 的 jQuery 插件
  • 有没有任何 jQuery 插件可以创建类似实时 feed 的东西推特主页 http www twitter com 使用 PHP 它从 MySQL 数据库获取数据 PHP 文件必须如何 Thanks 您确实不需要为此使用插件 您可以使用 j
  • 表“DBNAME.hibernate_sequence”不存在

    我有一个使用 spring data jpa 的 Spring Boot 2 0 1 RELEASE 应用程序
  • 缺少 /var/lib/mysql/mysql.sock 文件

    我正在尝试访问 mysql 当我运行 mysql 命令时 我得到以下信息 root ip 10 229 65 166 tpdatabase 1 8 0 28356 mysql 错误 2002 HY000 无法连接到 通过socket本地My
  • 在插入行上返回最后一个 ID (IDENTITY) VB.NET MySQL

    Dim insert coupon query As String INSERT INTO qa discountcoupons id status code VALUES AUTO INCREMENT ID 5 Dim cmd query
  • 获取两个表中某段时间内SUM数量的数据

    我有下面两张表 订单详细信息 OrderNumber quantityordered priceEach Orders OrderNumber orderDate 问题 orderDate 看起来像这样 2005 01 01 2005 02
  • Openshift MYSQL 环境变量未设置

    我的所有 MySQL 环境变量都会导致空字符串 例如 echo getenv OPENSHIFT MYSQL DB URL echo getenv OPENSHIFT MYSQL DB HOST 然而其他人 例如 回声 getenv OPE
  • 检索多行最后插入的 id

    当将数据插入具有自动递增 PK 的表时 我需要获取该密钥以在另一个语句中使用 正如许多问题所示 这可以在 PHP 中使用mysql insert id 但是 我一直将插入内容分组在一起 因此一次插入不止一行 我这样做是因为我猜测可能会存在一
  • PHP MySQL 检查表是否有主键

    我将查询 MySQL 服务器来检查表是否有主键 就像是 if mysql send SELECT TABLE table HAS PRIMARY KEY TRUE do stuff here SHOW INDEXES FROM TABLE
  • mysql_insert_id 带更新

    执行下面的查询后 我使用 PHP 函数mysql insert id 它总是给我0 UPDATE tbl training types SET fld serial serial no fld name training name fld
  • “key”是MySqli中的保留字吗?我收到错误

    我刚刚真正接触 MySql MySqli 并且正在使用准备好的语句 除了这一行之外 我的整个脚本运行良好 if stmt con gt prepare SELECT bandHash userHash userPassHash type F
  • 通过php在csv单元格中创建回车符

    我正在尝试动态生成一个 csv 文件 其中包含一些包含多行的单元格 例如 地址字段需要分组为单个 地址 单元格 而不是地址 城市 州等 一切进展顺利 但在过去的两天里 我尝试在代码中插入 r r n n chr 10 chr 13 以及回车

随机推荐