当前位置: 首页 > 知识库问答 >
问题:

在单个准备好的语句中执行>1条SQL语句

魏翔
2023-03-14
name  | status
------+--------
name1 | statusX
------+--------
name2 | statusY

我的目标是:我需要从表1中检索name2),但是我还需要检索具有相同名字的人的状态(在本例中是statusY)。注意,对于name2的检索,我不能依赖于json对象的索引(name2可能是json对象的第一个键)。

到目前为止,我将如何做到这一点:A)在第一个查询中从表1中获取name2),对其进行清理,以及B)在第二个查询中使用它,然后正确地检索状态

语句A)和B)都是参数化的准备好的sql语句,由AJAX调用以规则间隔触发(AJAX轮询)。

鉴于这些数据库查询因此被频繁地执行,我希望它们被尽可能快地执行,从而理想地将我上面的两个查询减少到一个。我的问题:我需要语句A)的结果来执行语句B),因此我无法将两个查询汇总到一个单独的准备好的语句中,因为准备好的语句不能包含多个sql语句。要达到我想要的效果,最好的解决方案是创建一个存储过程,如下所示:

set@name=SELECT.....表_1;选择....来自表2;

然后将其作为参数化的prepared语句执行;那是正确的吗?我对MySQL Server中的存储过程没有任何经验,并不真正需要它们,但如果您想将>1条sql语句包装成一条准备好的语句,它们似乎是唯一的解决方案。这个假设,以及我必须创建一个存储过程才能达到我想要的结果的结论,是正确的吗?

更新

见下面的补充答案,得到它的工作。

共有1个答案

锺离自明
2023-03-14

您可以使用MySQL(如果版本>5.7)查询JSON数据类型,因此您只需一个查询就可以完成所有操作

试一试

SELECT t1.name1, t1.name2, t2.status
FROM
(
  SELECT  JSON_EXTRACT(your_json_column, "$.name1") AS name1,
        JSON_EXTRACT(your_json_column, "$.name2") AS name2
  FROM table1
  WHERE JSON_EXTRACT(your_json_column, "$.name1") = 'info'
) t1
INNER JOIN table2 t2 ON t2.`name`=t1.name2

修改your_json_column的名称。此外,我假设您想搜索特定name1name2,因此,如果我的where子句是错误的假设,则将其删除。

 类似资料:
  • 问题内容: 将NHibernate配置为显示执行的SQL可以完成预期的工作,但是每当需要将SQL字符串复制粘贴到SQL Server Management Studio中时,为了使其兼容,我们都必须对其进行重新排列。 在开始开发自己的应用程序以将其解析并重新排列为对ManagementStudio更友好的SQL之前,我想重申一下以前从未做过的事情- 我不愿意花时间在此上,以后再查找。 是否有一种廉

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 问题内容: 我有一个使用准备好的语句的Doctrine_RawSql查询。但是,当生成SQL查询时,它们似乎会被忽略。但是,如果我忽略了标记值,则会得到关于不匹配的绑定变量数量的异常(因此,至少是试图将它们包含在内)。 如果我内联包含这些值,Doctrine是否在幕后做任何事情以防止SQL注入? 这是我的代码: 这提供了以下SQL输出: 编辑:上的属性已正确设置。如果我对参数进行硬编码: 我遇到了

  • 假设上面的代码是我的查询。什么是一个安全的替代方案,将允许自动增加在mySQL数据库。

  • 场景:继我之前的问题(在存储过程中使用游标循环行MySQL)之后,我尝试执行一个嵌套的prepare语句,在该语句中,我向外部语句输入一个日期,然后调用内部语句,该语句从表中获取数据。 代码: 问题:这段代码运行时没有错误,但没有给出任何结果。如果我只运行第一个准备好的语句,一个接一个地直接输入变量,就可以了。所以我猜问题在于我的第二句话。 问题:你知道我做错了什么吗? Obs:第二个代码应该循环

  • 问题内容: 我正在使用nodejs npm软件包, 我目前有一系列产品skus,例如.. 我的sql存储在文件中,如下所示… 然后,我还准备了如下语句: 正确地包含在对象中,因为当我简单地使用它时,该语句可以正常工作,我只是在努力如何传递数组以使它们在准备好的语句中工作。 我使用和修改字符串,以逗号分隔等,但我无法使这些方法正常工作。 我以为我需要param字符串才能如下所示。 如果有人可以阐明如