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?
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.
$db->qn()
au lieu de $db->quoteName()
et $db->q()
pour $db->Quote()