2017-09-29 64 views
-1

我有這個PHP代碼片段,我正在使用它來檢查表中的名稱性別,在foreach循環中作爲優化措施,我已將LIMIT 1包括到select語句中。當我在select語句上使用EXPLAIN時,索引被應用並且行列下的值爲1?簡單的選擇語句在foreach循環內

我還有其他方法可以進一步改進嗎?

foreach ($tmp as $key => $value) { 
    foreach ($value as $name) { 
     $statement = $dbh->prepare('SELECT gender FROM tbl WHERE names = :n LIMIT 1'); 
     $statement->execute(['n' => trim($name)]); 
     $user = $statement->fetch(PDO::FETCH::ASSOC); 
     if ($user["gender"] == "F") 
      $f++; 
     else if ($user["gender"] == "M") 
      $m++; 
     else 
      $mf++; 
    } 
} 
+0

你在找什麼樣的改進? –

+0

我想讓它更快?不知道有什麼類型的改進。 – hello

+0

這太模棱兩可了。 –

回答

1

這將是更容易地創建一個逗號分隔的名字列表,然後將其拖放到類似下面的查詢:

SELECT sum(gender = "F") 'females', sum(gender == "M") 'males', sum(gender != "F" && gender != "M") 'other'  
FROM tbl 
WHERE names IN (:list); 

然後,

$m = $user["males"]; 
$f = $user["females"]; 
$mf = $user["other"]; 

爲什麼循環查詢當一個人就足夠了? :)

+0

有3個計數器;改變你的第二個= M和其他東西。 –

0

我想你需要得到一個性別統計?那麼你可以做到這一點,沒有直接用SQL查詢循環如下:

$statement = $dbh->prepare(
    "SELECT 
     count(CASE WHEN gender = 'M' THEN id END) as m, 
     count(CASE WHEN gender = 'F' THEN id END) as f, 
     count(CASE WHEN gender IS NULL THEN id END) as mf 
    FROM tbl 
    WHERE names IN (?)" 
); 
$statement->bindValue([$name_array], [\Doctrine\DBAL\Connection::PARAM_STR_ARRAY]); 
$statement->execute(); 
$genderStatistics = $statement->fetch(PDO::FETCH::ASSOC); 

它應該工作得更快。