2017-09-29 55 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); 

它应该工作得更快。