我在更改SQL查询以更快地执行预测时遇到问题。我需要检索特定时间间隔的第一行和最后一行。例如,我正在寻找数据库中某个特定时间间隔(1小时,24小时)的第一个和最后一个日期。我有这个工作的sql语句,我正在使用php执行:
$query = "
SELECT Date, RainABS
FROM ws3600
WHERE Date IN (
(
SELECT MIN(Date)
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
AND Date <= '" . $timeInterval2 . "'
),
(
SELECT MAX(Date)
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
AND Date <= '" . $timeInterval2 . "'
)
)
";
从查询中可以看出,表名是ws3600,我检索的参数是Date和RainABS。我正在使用IN运算符和两个内部选择语句。
问题是,在执行时:
$result = mysql_query($query);
这需要很长时间。我用这段代码测量了它:
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$starttime = $mtime;
$result = mysql_query($query);
$mtime = microtime();
$mtime = explode(" ",$mtime);
$mtime = $mtime[1] + $mtime[0];
$endtime = $mtime;
$totaltime = ($endtime - $starttime);
平均花费0.28秒。问题是我必须执行24个这样的判断,平均累积到6,72个。我知道我应该可以摆脱内在的selecet声明,但后来我不知道怎么能得到第一行和最后一行?
答案 0 :(得分:4)
要使用MIN或MAX去除内部选择,答案通常是ORDER BY和LIMIT。
这样的事情:
SELECT Date, RainABS
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
AND Date <= '" . $timeInterval2 . "
ORDER BY Date ASC
LIMIT 1
UNION
SELECT Date, RainABS
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
AND Date <= '" . $timeInterval2 . "
ORDER BY Date DESC
LIMIT 1;
答案 1 :(得分:3)
这可以通过将查询数量减少一个来加快速度。
SELECT Date, RainABS
FROM ws3600
JOIN (
SELECT
MIN(Date) AS min,
MAX(Date) AS max
FROM ws3600
WHERE Date >= '" . $timeInterval1 . "'
AND Date <= '" . $timeInterval2 . "'
) AS x ON (ws3600.Date = min OR ws3600.Date = max);
编辑:回到大众需求......我在这里留下我的答案,因为它在技术上是正确的,但是,我相信最好的答案是使用两个UNION查询,如Szocske所建议。