在同一查询中 MySql
可以数一行只得到第一行吗?
现在我使用这个代码(我不知道是否正确):
$query1 = "
SELECT magni
FROM earthquakes
WHERE (milli BETWEEN '$data_dal' AND '$data_al')
AND (magni BETWEEN '$magn_min' AND '$magn_max')
AND (ipoc BETWEEN '$ipo_min' AND '$ipo_max')
AND (lati BETWEEN '$lat_inf' AND '$lat_sup')
AND (longi BETWEEN '$lng_sin' AND '$lng_des')
ORDER BY magni DESC
LIMIT 1";
$query2 = "
SELECT COUNT(*)
FROM earthquakes
WHERE (milli BETWEEN '$data_dal' AND '$data_al')
AND (magni BETWEEN '$magn_min' AND '$magn_max')
AND (ipoc BETWEEN '$ipo_min' AND '$ipo_max')
AND (lati BETWEEN '$lat_inf' AND '$lat_sup')
AND ((longi BETWEEN '$lng_sin' AND 180)
OR (longi BETWEEN -180 AND '$lng_des')
)";
$result1 = mysqli_query($con,$query1);
$result2 = mysqli_query($con,$query2);
$array_statistiche = array($result2,$result1); //numero eventi sismici, magniudo più alta
mysqli_free_result($array_statistiche);
$array_finale= $array_statistiche;
$array_terremoti= json_encode($array_finale); // return value of numero terremoti e array terremoti
mysqli_close($con); // close connection with database
非常感谢,对不起我的英语!
2条答案
按热度按时间vs3odd8k1#
在低于8+的mysql版本中,您需要两个单独的查询来执行此操作。但是,您始终可以向limit查询的select子句中添加一个子查询,以查找总计数,如下所示:
我省略了您的一些代码,一部分是因为它不影响答案,另一部分是因为我不太精通如何用php编写一个好的语句。您应该了解php中的预处理语句,因为直接将变量插入查询字符串通常是不好的做法。
如果您很好奇,下面是如何在mysql 8+中表达上述查询,而不使用任何子查询,使用
COUNT
作为分析函数:下面是一个演示(在SQLServer中,是编写此答案时最接近的匹配项),它显示了此替代方案的实际效果。
演示
nhhxz33t2#
如果你问的是在笨重的工作重复
WHERE
,那么这就是明显的赢家:第一个是你的
magni
,然后继续扫描表以获取计数。第二个以线程安全的方式获取该计数。SELECT MAX(magni) ...
获取不带ORDER BY
. 但在这种情况下,这是无济于事的。这些指数可能有助于加快这一进程。只能使用一个,但优化器将选择哪个。
如果确实需要只执行一个返回两个结果的查询,那么请考虑:
也就是说,将两个庞大的查询都放在一个
SELECT
. 你将重复WHERE
做两次同样的扫描。