web-dev-qa-db-fra.com

Jdatabase: Compter le nombre d'éléments dans un champ séparé par des virgules

J'ai un Jdatabasetable ayant un champ séparé par des virgules . Quel serait le meilleur moyen (selon normes de codage Joomla) de compter le nombre d'éléments séparés par des virgules. Comme dans le cas ci-dessous:

idcomma separated values

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

Il devrait retourner: 9

Si je ne me trompe pas, l’un des moyens de le réaliser en utilisant mysql serait le suivant:

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

Mais est-ce le meilleur moyen?

L'aide serait appréciée.

3
saibbyweb

Une approche serait la suivante:

$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();

Puis exploser le résultat dans un tableau, comme suit:

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

Puis comptez les éléments du tableau, comme suit:

$count = count($array);
3
Lodder

Votre question ne concerne pas spécifiquement Joomla, et ce n’est pas loin de la façon dont je vous recommande de le faire.

Démo SQL

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

CHAR_LENGTH() est légèrement plus fiable que LENGTH(). Si/lorsque vous essayez de traiter des caractères multi-octets avec LENGTH(), vous obtiendrez des résultats incorrects.

Bien sûr, si vous souhaitez voir la requête brute traduite en appel de méthode Joomla select(), il n'y a pas grand chose à changer:

$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"));

Si vos valeurs nom_table/nom_colonne ne contiennent pas d'espace, ne sont pas des mots clés réservés MySQL et ne proviennent pas de sources non fiables (soumises par l'utilisateur), vous pouvez alors omettre en toute sécurité les appels $db->qn().

0
mickmackusa