web-dev-qa-db-fra.com

Plusieurs comptes de la même table

J'avais l'habitude d'obtenir plusieurs COUNT dans une requête en utilisant le SUM (CASE WHEN

$db =& JFactory::getDBO();
$query = "SELECT
        SUM(CASE WHEN last_name LIKE 'A%' THEN 1 ELSE 0 END) as alpha,
        SUM(CASE WHEN last_name LIKE 'B%' THEN 1 ELSE 0 END) as beta
        FROM '#__mytable'"; 
$db->setQuery($query);
$results = $db->query();
while($row = mysqli_fetch_array($results)){
    $alpha = $row['alpha'];
    $beta = $row['beta'];
}
echo "ALPHA: ".$alpha;
echo "<br />BETA: ".$beta;

Y a-t-il un moyen de le faire dans une requête avec JDatabase et d'éviter plusieurs requêtes simples:

$db =& JFactory::getDBO();
$query = $db->getQuery(true);
$query->select( array('COUNT(id)'))->from($db->quoteName('#__mytable'))->where($db->quoteName('last_name') . ' LIKE ' .$db->quote('A%'));
$db->setQuery($query);
$alpha = $db->loadResult();

$query = $db->getQuery(true);
$query->select( array('COUNT(id)'))->from($db->quoteName('#__mytable'))->where($db->quoteName('last_name') . ' LIKE ' .$db->quote('B%'));
$db->setQuery($query);
$beta = $db->loadResult();

echo "ALPHA: ".$alpha;
echo "<br />BETA: ".$beta;

Si non, quelle serait la meilleure approche pour plusieurs comptes dans une requête?

2
John

Vous pouvez raccourcir et réutiliser la requête:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array('COUNT(id)'))
    ->from($db->qn('#__mytable'))
    ->where($db->qn('last_name') . ' LIKE ' . $db->q('A%'));
$db->setQuery($query);
$alpha = $db->loadResult();
// you can reuse the object, but not the where-clause:
$query->clear('where')
    ->where($db->qn('last_name') . ' LIKE ' . $db->q('B%'));
$db->setQuery($query);
$beta = $db->loadResult();
echo 'ALPHA: '.$alpha;
echo '<br />BETA: '.$beta;

Je pense que c'est un bon compromis. Et votre simple requête IMHO n’est pas vraiment une procédure peu coûteuse comparée à cela.

Aussi quelques astuces:

  • Dans la première ligne, vous ne devez plus utiliser le & à JFactory::getDbo().

  • Utilisez simplement ' au lieu de " pour toutes les opérations sur les chaînes, il n'y a pas d'analyse supplémentaire dans la chaîne si possible.

  • Vous pouvez utiliser $db->qn() au lieu de $db->quoteName() et $db->q() pour $db->Quote()
1
Tom Kuschel