1

我正在尝试做的示意图代码:

INPUT VAR inputOne; (First input of the desired statement)
INPUT VAR inputTwo; (Second input of the desired statement)
INPUT VAR inputThree; (Third input of the desired statement)

-

VAR repResult = getResult("SELECT * FROM `representatives` WHERE `rID` = inputOne LIMIT 1;")
VAR evResult = getResult("SELECT `events`.`eID` FROM `events` WHERE `eventDateTime` = inputTwo LIMIT 1;")

if (repResult != null && evResult != null) {
    execureQuery("INSERT INTO `votes` (`representatives_rID`, `events_eID`, `voteResult`) VALUES(inputOne,evResult.eID,inputThree);");
}

当我在单独的语句中执行它们时,它非常慢,特别是因为有 ~1.000.000 需要检查和插入。我想知道,是否有任何替代的单查询方式来执行此操作。

4

2 回答 2

3

You can use INSERT-SELECT syntax to accomplish this:

INSERT INTO `votes` (`representatives_rID`, `events_eID`, `voteResult`) 
select inputOne, `events`.`eID`, inputThree FROM `events` WHERE `eventDateTime` = inputTwo LIMIT 1

The above combines all three params into one INSERT-SELECT statement where the results of the select are sent to the insert.

See: Insert into ... values ( SELECT ... FROM ... ) for select-insert statement.

于 2013-04-24T00:03:06.703 回答
1

是的,您可以将这些语句放入 1 个存储过程(返回 2 个结果集并执行 1 个插入),但是不,这可能无济于事。因为 3 条 SQL 语句的网络流量不是很大,而且 MySQL 中的存储过程很慢。

rID 是主键吗?第一个查询是否提取了您并不真正需要的大字段?

eventDateTime 上是否有唯一索引?如果表不是 InnoDB,则索引应显式包含 eID,因此它成为覆盖索引。

制作这些钥匙后,您可以放下LIMIT 1.

rID 和 eID 数据类型是否尽可能小?

于 2013-04-23T23:56:33.700 回答