J'ai un Jdatabase
table 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:
id
comma 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.
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);
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.
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()
.