web-dev-qa-db-ja.com

同じテーブルからの複数のカウント

以前は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を使用する場合の最善の方法は何ですか。

2
John

クエリを短くして再利用できます。

_$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()を使用できます
1
Tom Kuschel