以前はSUM(CASE WHENを使用して1つのクエリで複数のCOUNTを取得していました
$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;
JDatabaseを使用して1つのクエリでそれを実行し、複数の単一クエリを回避する方法はありますか。
$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;
そうでない場合、1つのクエリで複数のCOUNTを使用する場合の最善の方法は何ですか。
クエリを短くして再利用できます。
_$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;
_
これは良い妥協だと思います。そして、あなたの単一のクエリIMHOは、これに比べて実際に安価な手順ではありません。
また、いくつかのヒント:
最初の行では、JFactory::getDbo()
で&を使用しないでください。
文字列操作に"の代わりに単純に'を使用すると、可能であれば、文字列の余分な解析は行われません。
$db->qn()
の代わりに$db->quoteName()
および$db->q()
の代わりに$db->Quote()
を使用できます