代码之家  ›  专栏  ›  技术社区  ›  Borja

在同一个查询中,MySql可以计算行数,只得到第一行吗?

  •  1
  • Borja  · 技术社区  · 6 年前

    在同一查询中 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 回复  |  直到 6 年前
        1
  •  1
  •   Rick James    6 年前

    如果你问的是大块头的重复劳动 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 . 你将重复 哪里

        2
  •  2
  •   Tim Biegeleisen    6 年前

    在低于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
    

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

    Demo