在同一个查询中,mysql是否可以计算行数并只得到第一行?

eanckbw9  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(627)

在同一查询中 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

非常感谢,对不起我的英语!

kulphzqa

kulphzqa1#

在低于8+的mysql版本中,您需要两个单独的查询来执行此操作。但是,您始终可以向limit查询的select子句中添加一个子查询,以查找总计数,如下所示:

SELECT
    magni,
    (SELECT COUNT(*) FROM earthquakes WHERE ...) AS cnt
FROM earthquakes
WHERE ...
ORDER BY magni DESC
LIMIT 1

我省略了您的一些代码,一部分是因为它不影响答案,另一部分是因为我不太精通如何用php编写一个好的语句。您应该了解php中的预处理语句,因为直接将变量插入查询字符串通常是不好的做法。
如果您很好奇,下面是如何在mysql 8+中表达上述查询,而不使用任何子查询,使用 COUNT 作为分析函数:

SELECT
    magni,
    COUNT(*) OVER () AS cnt
FROM earthquakes
WHERE ...
ORDER BY magni DESC
LIMIT 1

下面是一个演示(在SQLServer中,是编写此答案时最接近的匹配项),它显示了此替代方案的实际效果。

演示

svdrlsy4

svdrlsy42#

如果你问的是在笨重的工作重复 WHERE ,那么这就是明显的赢家:

SELECT SQL_CALC_FOUND_ROWS magni
    FROM earthquakes
    WHERE ...
    ORDER BY  magni DESC
    LIMIT 1;
SELECT FOUND_ROWS();

第一个是你的 magni ,然后继续扫描表以获取计数。第二个以线程安全的方式获取该计数。 SELECT MAX(magni) ... 获取不带 ORDER BY . 但在这种情况下,这是无济于事的。
这些指数可能有助于加快这一进程。只能使用一个,但优化器将选择哪个。

INDEX(magni),
INDEX(milli),
INDEX(lati)

如果确实需要只执行一个返回两个结果的查询,那么请考虑:

SELECT
    ( SELECT MAX(magni) ... ) AS max_magni,
    ( SELECT COUNT(*)   ... ) AS ct;

也就是说,将两个庞大的查询都放在一个 SELECT . 你将重复 WHERE 做两次同样的扫描。

相关问题