Mysql 将多个查询合并到单个查询中

Mysql 将多个查询合并到单个查询中,mysql,database,query-optimization,Mysql,Database,Query Optimization,我有用ORM语法编写的代码。它从文件中读取博客评论数据,并将它们插入blogs和comments表中我想把这段ORM代码带回mysql,因为我需要将尽可能多的查询组合到一个查询中,而这种优化在ORM语言中并不容易。我之所以需要这种优化,是因为我使用的是远程服务器,所以查询越少越好。我用mysql伪代码编写了下面的代码,因为我有点忘记了mysql 这是包含所有博客的所有评论的评论文件来自博客url告诉我此评论属于哪个博客 comment text from blog u

我有用ORM语法编写的代码。它从文件中读取博客评论数据,并将它们插入
blogs
comments
表中我想把这段ORM代码带回mysql,因为我需要将尽可能多的查询组合到一个查询中,而这种优化在ORM语言中并不容易。我之所以需要这种优化,是因为我使用的是远程服务器,所以查询越少越好。我用mysql伪代码编写了下面的代码,因为我有点忘记了mysql

这是包含所有博客的所有评论的评论文件<代码>来自博客url告诉我此评论属于哪个博客

comment text               from blog url
------------------------------------------
first comment text         first-blog-url
second comment text        first-blog-url
third comment text         first-blog-url
fourth comment text        blog-2-url
fifth comment text         blog-2-url
sixth comment text         3rd-blog-url
这是我用来处理文件的ORM代码。(在最底部,我添加了表的说明)

那么我的问题是:有没有可能在一个mysql查询中编写这个呢?

我发现了一个类似的问题,但它不能完全解决我的问题,我不确定这是否是最有效的方法

这两个表分别是
blogs
comments
,其中
comments
中的每一行都有一个字段
blogid
,该字段将其链接到
blogs
中的正确blog。因此,它基本上是一个1:many关系,其中每个
博客
行可以链接到许多
评论
行。它们看起来像这样:

blogs:

id        link                  other fields
--------------------------------------------
1         first-blog-url
2         blog-2-url
3         3rd-blog-url

comments:

id        commenttext     blogid
-----------------------------
1         random          1
2         comment         1
3         goes            1
4         here            2
5         any             2 
6         thing           3

如果不存在行,可以使用此技术插入行:

INSERT INTO blogs (link)
select 'first-blog-url' 
from dual
where not exists
( select 1
  from blogs
  where  link = 'first-blog-url'
);
正如您所看到的,select子句将只返回一行,其中的数据只有在数据库中还不存在时才会插入

要插入到
注释表中,可以使用相同的方法。您可以使用if inserted dued获得第二次查询的
Blog id
(如果没有,则需要新查询)

这只是一个起点,也许您可以将4个查询减少到3个。欢迎发表任何意见,以确定最终解决方案


正如您所知,MySQL没有MERGE语句。我认为这与您的要求不匹配。

要插入到两个表中,您至少需要两条sql语句(一条接一条)。你知道吗?否则,需要存储过程或触发器。过程或触发器对您来说是有效的解决方案吗?@danihp我的主要目标是在可能的情况下与数据库服务器联系一次。因此,我对任何有助于我做到这一点的事情都没有意见。@danihp我应该指出,我试图组合的两个查询是相关的,但不是完全相同的。第二个查询只使用了第一个查询中的
blog\u id
。我想知道,dual
中的
是一个命名错误的表,还是一个特殊的关键字?那么是否可以进一步嵌套注释插入,以便blog插入和注释插入都在同一个查询中?每个表都需要一个insert语句。不能在同一语句中同时插入。也许你想把所有的代码封装成一个。
INSERT INTO blogs (link)
select 'first-blog-url' 
from dual
where not exists
( select 1
  from blogs
  where  link = 'first-blog-url'
);