【问题标题】:In same query MySql is possible to count row and get only the first row?在同一个查询中,MySql 可以计算行并只获取第一行吗?
【发布时间】:2018-08-27 14:07:58
【问题描述】:

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

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

【问题讨论】:

  • 您需要在 MySQL 中对此进行两个单独的查询,至少在 8+ 之前的版本中。但是,您可以在 select 子句中编写计数查询。

标签: php mysql database performance mysqli


【解决方案1】:

在低于 8+ 的 MySQL 版本中,您需要两个单独的查询来执行此操作。但是,您始终可以将子查询添加到限制查询的 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

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

Demo

【讨论】:

  • 嗯我明白了 :) 只有一个怀疑返回这个查询(你的第一个例子)?如何添加不同的数据(计数和第一项),如 php 数组中的两个不同元素?我知道问题是关于 MySql 但我想了解使用查询返回的内容
  • 其他人可以帮助您使用 PHP,我只是给出了您可能在此处使用的查询结构。
【解决方案2】:

如果您在庞大的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 并执行两次相同的扫描。

【讨论】:

  • 为了性能更好执行两个不同的查询或一个查询?
  • @Borja - 这取决于很多事情。由于向服务器发送查询存在开销,因此 2 个单独的查询可能比发送一个复杂查询要慢。但我不能说“总是”。我的最后一个示例可能比 2 个单独的查询快,因为增加的复杂性并不多。
  • 我用了你的最后一个例子,效果很好。谢谢:)
猜你喜欢
  • 2016-11-01
  • 2021-02-16
  • 1970-01-01
  • 2021-05-29
  • 2021-05-09
  • 2010-10-31
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
相关资源
最近更新 更多