2011-07-27 53 views
1

该代码片段旨在返回此表中每个回合的最小和最大ID 我只是想知道是否有一个不太笨拙的方式来做到这一点。PHP mysqli是最简单的方法吗?

$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]; 
} 

hurr ...

改为,

$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]; 
     } 
    } 
+0

最糟糕的做法,我想我不需要array_values打电话,因为我通过一个foreach做... – Jamie

+0

这是萨吉和马克之间的折腾。感谢你们俩。 – Jamie

回答

2

如何在一个查询中这样做:

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"; 

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

1

使用group by

是我见过

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

我有一个foreach爱孩子的时刻,我相信你一直在那里。 :P – Jamie