2017-09-29 4 views
-1

J'ai cet extrait PHP ci-dessous que j'utilise pour vérifier le genre des noms d'une table, à l'intérieur d'une boucle foreach, comme mesure d'optimisation, j'ai inclus LIMIT 1 à l'instruction select. Lorsque j'utilise EXPLAIN dans l'instruction select, les index ont été appliqués et la valeur sous la colonne row est 1?instruction select simple dans foreach loop

Y a-t-il d'autres façons d'améliorer cela?

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

Quel type d'amélioration recherchez vous? –

+0

Je suppose que c'est plus rapide? Je ne sais pas quel type d'améliorations il y a. – hello

+0

C'est trop ambigu. –

Répondre

1

Il serait plus facile de créer une liste de noms séparés par des virgules, puis déposez-le dans quelque chose comme la requête suivante:

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

puis,

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

etc.

Pourquoi les requêtes en boucle sont-elles suffisantes? :)

+0

Il y a 3 compteurs; changez votre seconde en = M et autre chose. –

0

Je suppose que vous devez obtenir une statistique de genre? Ensuite, vous pouvez le faire sans cycles directement avec la requête SQL comme suit:

$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); 

Cela devrait fonctionner plus rapidement.