2014-03-07 79 views
1

看看這段代碼第一:如何把SQL查詢中爲()循環

<?php 

$dbhost = 'xxxxx'; 
$dbuser = 'xxxxxx'; 
$dbpass = 'xxxxxxx'; 
$conn = mysql_connect($dbhost, $dbuser, $dbpass); 
if(! $conn) 
{ 
    //Some code 
} 

$sql1 = 'SELECT AVG(time) FROM lucky WHERE interviewer=1'; 
$sql2 = 'SELECT AVG(time) FROM lucky WHERE interviewer=2'; 
. 
. 
$sql100 = 'SELECT AVG(time) FROM lucky WHERE interviewer=100'; 

mysql_select_db('xxxxxx'); 

$retval1 = mysql_query($sql1, $conn); 
$avg1 = mysql_result($retval1,0); 
. 
. 
$retval100 = mysql_query($sql100, $conn); 
$avg100 = mysql_result($retval100,0); 

if (! $retval) 
{ 
    //Some code 
} 

mysql_close($conn); 

?> 

<table width='1100' border='0' align='center'> 
    <tr> 
    <td>1</td> 
    <td><?php echo round($avg1, 2); ?></td> 
    </tr> 
    . 
    . 
    <tr> 
    <td>100</td> 
    <td><?php echo round($avg100, 2); ?></td> 
    </tr> 
</table> 

什麼實際發生的情況是,如果面試官1分貝被發現,那麼它的平均時間進行計算,然後顯示在下表中。必須爲100位面試官完成。我想要的只是使用更簡單的方法來執行此操作,例如使用for()循環。另外,我希望如果在db中找不到採訪者1,我不想顯示空白行。我只想在出現命中時顯示它。 請幫忙。

+2

沒有人。不要將查詢放在循環中,特別是不要查詢100個查詢。只要檢索麪試官和他的所有采訪兩個查詢。比採訪者結果找到了入口循環訪談結果的結果並計算平均值。面試時間。但不要將查詢放入循環中。爲什麼100查詢你可以在1查詢中做什麼,不好的編程實踐人員。 –

+0

也爲上帝的緣故停止使用mysql_並開始使用mysqli/PDO ... –

回答

5

你真的不希望把SQL在一個循環中您將執行100個查詢,而不是單一的一個。

如果您只是使用簡單聚合(如下圖所示)來獲得最佳性能,那麼這會扼殺您網站的性能。

此外,mysql庫已被棄用,請改用mysqli。

這樣做:

$sql = 'SELECT interviewer, AVG(time) AS avg_time 
     FROM lucky 
     WHERE interviewer BETWEEN 1 AND 100 
     GROUP BY interviewer'; 

$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

// Execute the query 
$result = $mysqli->query($sql); 

// Display the results in a table 
echo '<table><tbody>'; 
while ($row = $result->fetch_assoc()) { 
    echo '<tr>'; 
    echo '<td>' . $row['interviewer'] . '</td>'; 
    echo '<td>' . round($row['avg_time'], 2) . '</td>'; 
    echo '</tr>'; 
} 
echo '</tbody></table>'; 

// Close the resultset 
$result->close(); 

什麼我做以上是拉動所有面試的平均時間,由面試官#一起將它們分組。

這將自動消除在數據庫級別缺少的訪調員。

然後,我用while循環遍歷數據庫結果。

這是從數據庫中查詢和顯示多個項目的可接受編程實踐。數據庫在過濾和聚合數據方面速度非常快。用它的優點。如果您嘗試將該邏輯拉入PHP中,並且查詢數據庫100次,則無需任何操作即可將100倍的延遲和連接處理增加。

+0

完美!謝謝Steven! :) – Niks

+1

特別是,你給的解釋,真的有幫助。作爲初學者,我會申請一個for循環...:p – Niks

+0

不客氣,尼克斯。很高興我能幫上忙! –

1

試試這個代碼

for($i=1; i<=100; $i++) 
{ 
$sql1 = 'SELECT AVG(time) FROM lucky WHERE interviewer='.$i; 

} 

OR

$sql1 = 'SELECT AVG(time) FROM lucky WHERE interviewer BETWEEN 1 AND 100

+0

它會將所有面試者從1到100分配到$ sql1。我將如何在下面的HTML表格中顯示它? – Niks

+5

Downvoted用於糟糕的編程練習。至少你可以添加一個解釋爲什麼這只是可怕的錯誤。並且給了他一個關於mysql_的信息。這太可怕了,我不認爲這正是他要求的。 select_db語句也是毫無意義的,查詢也不會執行。 –

+0

你可以寫for循環在 – Prafulla

0
echo "<table width='1100' border='0' align='center'>"; 
    for($i=1; i<=100; $i++) 
    { 
    $sql1 = 'SELECT AVG(time) FROM lucky WHERE interviewer='.$i; 
    echo "<tr>"; 

    mysql_select_db('xxxxxx'); 
    $retval1 = mysql_query($sql1, $conn); 
    $avg1 = mysql_result($retval1,0); 
    echo "</tr>"; 
    } 
echo "</table>"; 
0

您可以使用這個簡單的查詢。

SELECT avg(time) FROM lucky GROUP BY interviewer 

無需循環。