【问题标题】:PHP mysqli is this the easiest way?PHP mysqli 这是最简单的方法吗?
【发布时间】:2011-10-14 15:40:39
【问题描述】:

代码 sn-p 旨在返回此表中每一轮的最小和最大 id 我只是想知道是否有一种不那么笨重的方法。

$query = "SELECT round FROM $tablename";
$rounds = Array();
if ($result = $Login->mysqli->query($query)) {
    while ($row = $result->fetch_array(MYSQL_ASSOC)) {
        $rounds[] = $row['round'];
    }
}
$rounds = array_unique($rounds);
$rounds = array_values($rounds);
$roundBound = Array();
foreach ($rounds as $roundNum) {
    $query = "SELECT MIN(id), MAX(id) FROM $tablename WHERE round = $roundNum;";
    $result = $Login->mysqli->query($query);
    $row = $result->fetch_row();
    $roundBound[] = $row[0];
    $roundBound[] = $row[1];
}

快点……

改为,

$query = "SELECT MIN(id), MAX(id) FROM $tablename GROUP BY round";
    if($result = $Login->mysqli->query($query)) {
        while ($row = $result->fetch_row()) {
            $roundBound[] = $row[0];
            $roundBound[] = $row[1];
        }
    }

【问题讨论】:

  • 我想我不需要 array_values 调用,因为我正在通过 foreach 进行调用...
  • 这是萨吉和马克之间的折腾。谢谢你们俩。

标签: php optimization mysqli


【解决方案1】:

如何在单个查询中执行此操作:

SELECT MIN(id), MAX(id) FROM $tablename GROUP BY round

【讨论】:

    【解决方案2】:

    运行单个查询并使用WHERE round IN (....) 子句会更有效:

    $round_clause = implode(',', $rounds);
    
    $query = "SELECT round, MIN(id), MAX(id) FROM $tablename WHERE round IN ($round_clause) GROUP BY round";
    

    作为一般规则,执行返回“大量”行的单个查询将比执行一次仅返回几行或一行的一系列较小/单个查询更有效。您只需扫描一次索引,您只需检索一次数据。

    【讨论】:

      【解决方案3】:

      使用group by

      在 foreach 中使用查询是我见过的最糟糕的做法

      SELECT Min(id), Max(id) FROM $tablename GROUP BY round
      

      【讨论】:

      • 我有一个爱孩子的时刻,我敢肯定你去过那里。 :P
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2016-08-26
      • 2014-11-11
      • 2017-03-28
      相关资源
      最近更新 更多