将多个查询组合到单个查询中

时间:2012-08-25 18:15:05

标签: mysql database query-optimization

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

这是包含所有博客的所有评论的评论文件。 from blog 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代码。 (在最底层,我添加了表格的描述)。

//I read a comment from the comments file, `comment text` and `from blog url`

//does a blog exist that has 'link' that matches 'from blog url'
$blog = //SELECT FROM blogs where 'link' has value 'first-blog-url'

//if it doesn't exist, create it
if($blog == null){
    $blog = INSERT INTO blogs a new record and set 'link' to 'first-blog-url'
}

//then read the id of the (existing or just-created) blog row
$blog_id = $blog->getId();

//then use the $blog_id to insert the comment into the 'comments' table.

//does this comment text already exist for this blog id?
$comment = SELECT FROM comments where `commenttext' has value 'whatever comment text' and 'blogid' has value $blog_id

//if it doesn't exist, create it
if($comment == null){
    $comment = INSERT INTO comments a new record and set 'commenttext' to 'the comment text' and 'blogid' to $blog_id.
}

$comment_id = $comment->getId();

所以我的问题:是否可以在单个mysql查询中编写它?

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

这两个表格为blogscommentscomments中的每一行都有一个字段blogid,可将其链接到blogs中的右侧博客。所以它基本上是1:多关系,其中每个blog行可以链接到许多comment行。它们看起来像这样:

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

1 个答案:

答案 0 :(得分:3)

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

INSERT INTO blogs (link)
select 'first-blog-url' 
from dual
where not exists
( select 1
  from blogs
  where  link = 'first-blog-url'
);

如您所见,select子句只返回一行,只有当数据库中尚不存在时才会插入数据。 You can test it at SQLFIDDLE.

要插入comment表格,您可以使用相同的技巧。如果插入了LAST_INSERT_ID(),则可以Blog id获取{{1}}第二个查询(如果不是,则需要新查询)。

这只是一个重要的开始,也许你可以将你的4个查询减少到3个。欢迎任何评论以达成最终解决方案。

如您所知,MySQL没有MERGE语句。我认为replace与您的要求不符。