web-dev-qa-db-ja.com

Jdatabase:カンマ区切りフィールドの要素数を数える

カンマ区切りフィールドを持つJdatabasetableがあります。カンマで区切られた要素の数を数えるには(Joomlaコーディング標準に従ってに従って)最良の方法は何でしょうか。以下の場合のように:

idcomma separated values

01(2,5,6,7,8,9,21,24,28)

返されるはずです:9

私が間違っていなければ、mysqlを使用してそれを達成する方法の1つは次のようになります。

SELECT (LENGTH(column_name) - LENGTH(REPLACE(column_name,",","")) + 1) AS MyColumnCounts
FROM table_name;

しかし、これは最善の方法ですか?

助けていただければ幸いです。

3
saibbyweb

1つのアプローチは次のようになります。

$db = JFactory::getDbo();
$id = 20; // Example ID

$query = $db->getQuery(true);
$query->select($db->qn('roll_no'))
      ->from($db->qn('#__table_name'))
      ->where($db->qn('Id') . ' = '. $id);
$db->setQuery($query);

$result = $db->loadResult();

次に、次のように結果を配列に分解します。

$array = explode(',', $result);

次に、次のように配列の項目を数えます:

$count = count($array);
3
Lodder

あなたの質問は特にJoomlaに関するものではなく、私がそれを行うことをお勧めする方法から遠くありません。

SQLデモ

_SELECT SUM(CHAR_LENGTH(csv) - CHAR_LENGTH(REPLACE(csv, ',', '')) + 1) AS num_of_commas
_

CHAR_LENGTH()は、LENGTH()と比べて信頼性が少し高くなっています。 LENGTH()でマルチバイト文字を処理しようとすると、誤った結果が生成されます。

もちろん、Joomla select()メソッド呼び出しに変換された生のクエリを確認したい場合、変更することはあまりありません。

_$query = $db->getQuery(true)
            ->select("SUM(CHAR_LENGTH(" . $db->qn("column_name") . " - CHAR_LENGTH(REPLACE(" . $db->qn("column_name") . ", ',', '')) + 1) AS MyColumnCounts")
            ->from($db->qn("table_name"));
_

Table_name/column_nameの値にスペースが含まれておらず、MySQLの予約キーワードではなく、信頼できないソースから提供されていない(ユーザーが送信した)場合は、$db->qn()呼び出しを安全に省略できます。

0
mickmackusa