如何在MySQL 5 .7中实现CTE功能?

2023-12-10

我有一个 USERSEARCH 表,应该用于快速搜索用户的子字符串。此功能用于在有人输入用户名或姓名时进行自动完成搜索。但是,我感兴趣的查询只会显示搜索者关注的用户子集的匹配项。这可以在 USERRELATIONSHIP 表中找到。

USERSEARCH
-----------------------------------------------
user_id(FK)    username_ngram          name_ngram
1              "AleBoy leBoy eBoy..."  "Ale le e"
2              "craze123 raze123 ..."  "Craze raze aze ze e"
3              "john1990 ohn1990 ..."  "John ohn hn n"
4              "JJ_1 J_1 _1 1"         "JJ"


USERRELATIONSHIP
-----------------------------------------------
user_id(FK)    follows_id(FK)
2              1
2              3

当有人刚刚输入“Al”(不考虑用户关系)时,会发出这样的查询:

SELECT * FROM myapp.usersearch where username_ngram like 'Al%'
        UNION DISTINCT
        SELECT * FROM myapp.usersearch where name_ngram like 'Al%'
        UNION DISTINCT
        SELECT * FROM myapp.usersearch                            
        WHERE MATCH (username_ngram, name_ngram) AGAINST ('Al')  
        LIMIT 10

由于 username_ngram、name_ngram 和 FULLTEXT(username_ngram, name_ngram) 上的现有索引,速度非常快。但是,在我的应用程序上下文中,我需要将搜索限制为搜索者所关注的用户。我想用“myapp.usersearch”表的子集替换“myapp.usersearch”表,仅包括搜索者正在关注的用户。这是我尝试的:

    WITH

--Part 1, restrict the USERSEARCH table to just the users that are followed by searcher

        tempUserSearch AS (SELECT T1.id, T2.username_ngram, T2.name_ngram FROM
        (SELECT follows_id FROM myapp.userrelationship WHERE user_id = {user_idOfSearcher} ) AS T1 
        LEFT JOIN myapp.usersearch AS T2  ON T2.user_id = T1.follows_id)

            SELECT * FROM tempUserSearch where username_ngram like 'Al%'
            UNION DISTINCT
            SELECT * FROM tempUserSearch where name_ngram like 'Al%'
            UNION DISTINCT
            SELECT * FROM tempUserSearch                            
            WHERE MATCH (username_ngram, name_ngram) AGAINST ('Al')  
            LIMIT 10

不幸的是 MySQL 5.7 不支持 CTE WITH 子句。

有没有办法在所有后续子查询中引用查询的第 1 部分,而无需重新查询该人关注的用户的 user_ids ? (在 MySQL 5.7 中)

Update:

MySQL 5.7 中真的没有办法多次引用一个查询吗?似乎有些不对劲,因为在我看来这对于任何数据库来说都是一项基本任务。

为什么不这样做:“x join y on a or b or c”?我的子字符串查询的速度取决于以下索引:

index(username_ngram)

index(name_ngram)

FULLTEXT(username_ngram, name_ngram)

使用 OR 并不能得到任何索引的帮助。


MySQL 5.7 不支持公共表表达式;这WITH语法仅在版本 8.0 中可用。

由于现有查询运行速度很快,因此在外部查询中进行过滤可能是可行的解决方案:

SELECT ur.id, ng.username_ngram, ng.name_ngram
FROM myapp.userrelationship ur
INNER JOIN (
    SELECT * FROM myapp.usersearch WHERE username_ngram LIKE 'Al%'
    UNION DISTINCT
    SELECT * FROM myapp.usersearch WHERE name_ngram LIKE 'Al}%'
    UNION DISTINCT
    SELECT * FROM myapp.usersearch WHERE MATCH (username_ngram, name_ngram) AGAINST ('Al')  
) ng ON ng.user_id = ur.follows_id
WHERE ur.user_id = {user_idOfSearcher}
ORDER BY ??
LIMIT 10

Notes:

  • 我转身LEFT JOIN to an INNER JOIN因为我认为这更接近你想要的(如果不符合你的要求你可以把它改回来)

  • 你需要一个ORDER BY条款与LIMIT,否则当结果集中超过 10 行时,结果不确定

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

如何在MySQL 5 .7中实现CTE功能? 的相关文章

  • 如何在 phpmyadmin 中创建 MySQL 触发器

    我想在 MySQL 中创建一个触发器 我运行以下命令 mysql gt delimiter mysql gt CREATE TRIGGER before insert money BEFORE INSERT ON money gt FOR
  • 如何有效地从 DB2 表中删除所有行

    我有一个大约有 50 万行的表 我想删除所有行 如果我做简单的delete from tbl 事务日志已满 我不关心这种情况下的事务 无论如何我都不想回滚 我可以删除许多事务中的行 但是有更好的方法吗 如何有效地从 DB2 中的表中删除所有
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • 如何在SSRS中的表上创建热图?

    如何在 SSRS 中创建这样的内容 颜色将根据行中的值 承销商 从红色变为绿色 所有这些都在一个组中 您可以通过右键单击各个单元格并根据表达式设置填充颜色来完成此操作 In the Image below I ve mistakingly
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • java mysql 准备好的语句

    我正在尝试使用 java 向数据库中进行简单的插入 它告诉我我的 sql 语法已关闭 但是 当我复制打印出来的字符串并将其放入 phpmyadmin 中的 sql 命令中时 它会正确执行该命令 并且我似乎无法弄清楚 java 中的字符串查询
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • SQL Server 用分隔符分割字符串

    我有一个输入字符串 100 2 3 101 2 1 103 2 3 我想解析它并将其添加到具有 3 列的表中 因此它应该是 f x col1 col2 col3 100 2 3 类似的其他数据以逗号分隔作为记录和 作为列 Thanks ni
  • 使用两个日期之间的随机日期时间更新每一行

    我有一个专栏叫date created我希望每一行保存一个随机日期 日期距当前时间为 2 天 我正在运行以下查询 但它会更新具有相同随机日期的所有行 我希望每一行都是随机的并且不相同 update table set date create
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • Oracle:使用SQL或PL/SQL查找动态SQL中的错误位置

    如何在 PL SQL 或 SQL 中找到动态 SQL 语句中的错误位置 从 SQL Plus 中 我看到了错误的位置 例如 无效的 SQL DML 语句 SYS orcl gt SELECT 2 X 3 FROM 4 TABLEX 5 TA
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗
  • Mysql 中 UNION 子句的替代方案

    我有两张桌子 表 a 表 b table a ID 1 2 3 4 5 7 table b ID 2 3 4 5 6 我必须得到这样的输出而无需UNION命令 ID 1 2 3 4 5 6 7 注意 我有一个联合解决方案 select fr
  • 是否有适用于所有数据库的标准sql

    如下所示 不同数据库的语法有所不同 是否存在适用于所有数据库的标准方法 有没有什么工具可以将任意sql转换为任意sql SQL Server 2005 CREATE TABLE Table01 Field01 int primary key
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐

  • 如果套接字必须已经绑定到它,为什么 DatagramSocketImpl joinGroup 方法需要一个 NetworkInterface?

    只是好奇 这是多余的吗 您还没有绑定您要使用的网络吗 也许这是您绑定到 0 0 0 0 并且现在只想侦听来自接口 X 的多播数据包的情况 如果您绑定到 INADDR ANY 这是正常情况 则加入组 IGMP 消息将通过路由表显示提供到多播地
  • 从模态返回数据时 ng-grid 中的范围混乱

    这是笨蛋 http plnkr co edit aqLnno p preview 我有一份人员名单 scope persons 显示在 ng grid 中 每行都有一个编辑按钮 当用户单击按钮 ng click edit row 见下面的代
  • 基于浏览器语言的 404 页面与 mod_rewrite 如何

    我试图通过评估客户端 HTTP Accept Language 标头来纯粹基于 Apache mod rewrite 规则生成语言相关的 404 还有其他错误 页面 我已经设法使用以下规则显示正确的页面 默认英文 RewriteEngine
  • JOptionPane.showMessageDialog 截断 JTextArea 消息

    我的 Java GUI 应用程序需要快速向最终用户显示一些文本 因此JOptionPane实用方法似乎很合适 此外 文本必须是可选择的 用于复制和粘贴 并且可能有点长 约 100 个单词 因此它必须很好地适合窗口 屏幕外没有文本 理想情况下
  • 将自定义属性添加到客户端实体类

    我需要向实体框架类添加自定义属性 但是当我这样做时 我收到 为类型 XXX 指定的属性名称 XXX 无效 错误 我可以为该属性提供一些属性 以便它被忽略并且不映射到任何东西吗 编辑 如果我添加自定义属性 按照下面 Martin 的示例 则以
  • Internet Explorer 错误:SCRIPT5009:ArrayBuffer 未定义

    我在 Internet Explorer 9 中收到错误 但在其他浏览器上不会出现该错误 它是 SCRIPT5009 ArrayBuffer 未定义 我的代码如下 var rawLength raw length var array new
  • 使用 REST 和 C# 实现 Google 音译 API,面临 unicode 和解析问题

    我一直在尝试使用 RESTful 方法来使用 Google Transliterate API 因为通过服务器端语言 此处为 C 很容易做到这一点 所以 我遇到了这种 URL 格式 它返回以下格式的 JSON ew bharat hws e
  • 如何自动停止 jQuery 验证表单验证?

    我有一个文本框 在其中创建了一个 onblur 脚本 该脚本接受输入并将其转换为日期 我正在使用 jQuery validate plugin 来验证输入 但问题是用户的输入通常在我解析之后才有效 这使得 jQuery 验证所做的自动验证既
  • Graphhopper 返回“未找到”

    我正在测试 graphhopper 有几天了 但是有一个奇怪的问题 当位置对于下一个街道 graphhopper 来说太远时 返回错误 未找到 奇怪的是它可以在 graphhopper demo server 上运行 我尝试了阿尔卑斯山 欧
  • PHP读取受保护的文件

    我在子域 a 上有一个 xml 文件 在子域 b 上有一个 php 脚本 我想通过 PHP 读取并使用 XML 文件中的数据 这就是问题所在 该文件使用 HTTP 身份验证进行保护 如何让PHP登录并读取文件内容 The 网址包装器支持表单
  • 配置 ruamel.yaml 以允许重复键

    我正在尝试使用ruamel yaml用于处理包含重复键的 Yaml 文档的库 在这种情况下 重复的键恰好是合并键 lt lt 这是 yaml 文件 dupe yml foo ref1 a 1 bar ref2 b 2 baz lt lt r
  • 未捕获的引用错误:jQuery 未定义[重复]

    这个问题在这里已经有答案了 我在我的网站上实现了一些 JavaScript 但我不断收到以下错误消息 未捕获的 ReferenceError jQuery 未定义 and 未捕获的语法错误 意外的标记 这是我在 header php 中使用
  • 在 Linux 上的 Eclipse RCP 应用程序中加载本机库

    我有一个 Eclipse RCP 应用程序 它通过 JNI 使用一些本机库 这些是动态链接到彼此的共享库 在 Windows 上我把这些库 如 dll文件 旁边的 RCP 启动器可执行文件 exe 文件并通过加载它们System load
  • 如何使用打字稿在第三方类上定义方法?

    我正在尝试扩展第 3 方课程 但无法让打字稿发挥良好作用 基本上 我不能在新方法中使用类中已定义的任何现有方法 解决方法是重新定义现有方法extensions ts 见下文 但必须有更好的方法 第三方index d ts export as
  • 为什么转置日期格式为 dd/mm/yy 的数组会将某些日期更改为 mm/dd/yy 格式?

    行为 当我转置包含日期的一维数组以便将它们完整地打印到一张纸上时 某些日期会从dd mm yy to mm dd yyyy 特别是当该月的某一天 小于或等于12 例如January 2 2016 02 01 16 or May 11 201
  • 如何在服务器无法访问存储库的情况下从 git 存储库进行部署?

    我在 BitBucket git 存储库中有一个 PHP 项目 我在一个名为 开发 的分支中工作以进行小修复 或者在临时功能分支中工作 当我准备好部署时 我将这些分支合并到 master 中 我想让部署到我的实时站点变得如此简单 合并到 m
  • 为什么 javac“-source”标志不起作用?

    我正在测试javac source标志 我对它应该如何工作有点困惑 请参阅此代码作为示例 这是一个不兼容Java5代码的方法isEmpty 在该版本的 JDK 中没有为 String 定义 public class TestJavac pu
  • 在 beforeunload 事件处理程序中停止页面卸载

    在用户导航页面之前 代码会检查他是否编辑了某些表单字段 如果他这样做了 我会显示一个模式窗口Yes and No纽扣 如果他单击 否 模式应关闭并且用户仍保留在该窗口上 如果是 保存更改并卸载 window bind beforeunloa
  • 在我的 Mac 上的 gdb 7.6 上运行 make 时出错

    我在运行 make for gdb 时遇到以下错误 这是在我的 Mac 上运行配置后的结果 该 Mac 运行 OS X 10 8 5 和 i7 内部处理器 海湾合作委员会版本是 gcc v Configured with prefix Ap
  • 如何在MySQL 5 .7中实现CTE功能?

    我有一个 USERSEARCH 表 应该用于快速搜索用户的子字符串 此功能用于在有人输入用户名或姓名时进行自动完成搜索 但是 我感兴趣的查询只会显示搜索者关注的用户子集的匹配项 这可以在 USERRELATIONSHIP 表中找到 USER