1

Bonjour,

Je dois faire des statistiques sur des données contenu dans un champ MOTIF d'une table MA_TABLE.



Ils sont par exemple de ce type:
Haricots|Pomme de terre|Carotte|Navets
Tomate|Carotte|Haricots
Poivrons|Haricots|Tomate
Navets
Sauce|Haricots
Poivre
Sel|Gimgembre

J'aimerai avoir le nombre d'occurrences des chaines de caractères Tomate, Poivrons, Pomme de terre, Navets, ...

Mais je ne trouve pas du tout comment faire avec une requête SQL ...

Si je n'avais que des données simples sans pipes, c'est à dire:

Haricots
Pomme de terre
Carotte
Navets
Tomate
Carotte
Haricots
Poivrons
Haricots
Tomate
Navets
Sauce
Poivre
Sel
Gingembre




, ce serait plus simple d'écrire:

SELECT MOTIF, COUNT(MOTIF) AS NB
FROM MA_TABLE
GROUP BY MOTIF

Sachant que je ne prends pas connaissance des différentes valeur que peut contenir le champs motifs.
Je veux seulement le comptage des éléments par nom d'éléments que je vais mettre dans une grille de données comme l'exemple qui suit:
Carotte 1
Gingembre 1
Haricots 4
Navets 2
Pomme de terre 1
Poivrons 1
Tomate 2
Poivre 1
Sauce 1
Sel 1










Merci de m'aider s'il vous plait.

PS: Comme les données sont confidentielles, je les ai remplacé par des noms de légumes et autres pour le fun...


2

Je ne pense pas que tu puisses travailler simplement sur des occurrences de mots dans une requête (il faut que tu le fasses côté script). Par contre, tu aurais pu bricoler avec des masques (en utilisant cheeky, mais vu que tu dis "Sachant que je ne prends pas connaissance des différentes valeur que peut contenir le champs motifs.", ça n'est pas possible (il faudrait que tu aies une connaissance a priori de chaque motif possible)...
avatar

3

Oki

Donc supposons que j'ai une autre table contenant les différents motifs possibles, et un ID qui s'y réfère. Du type:

MOTIF2 INDICE

Carotte 1
Gingembre 2
Haricots 3
Navets 4
Pomme de terre 5
Poivrons 6
Tomate 7
Poivre 8
Sauce 9
Sel 10


Que me proposerais tu donc ?

4

Peut-il y avoir plusieurs fois le même légume dans le même MOTIF, du genre « Tomate|Carotte|Tomate » ?
Comme Nil fait remarquer que tu ne sais rien à propos des motifs, je suppose que c’est possible, auquel cas je ne vois rien d’autre qu’un script non SQL…
avatarJe ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.

5

Je suis assez novice en bases de données, mais cette méthode de stockage me semble bizarre et pas pratique... (après si la structure de la table t'es imposée, je sais bien qu'il n'y a rien à faire)
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

6

Alors,
Pour te répondre Ethaniel, non il n'est pas possible d'avoir le même légume.
Je rappelle que ce sont des checkbox, donc quand j'ai Pomme de terre|Carotte|Navets, ca veut dire que la personne a coché en 1er Pomme de terre, puis Carotte, et enfin Navets. Car elle doit cocher selon un ordre de préférence


Ensuite, pour te répondre Zerosquare, effectivement je pense que je ne peux pas faire grand chose avec uniquement du sql.
Donc je vais devoir introduire du javascript, sachant que je connais une méthode en PHP qui permet de me donner les infos sans les pipes (fonction explode() ), mais je ne sais pas si je peux utiliser le PHP.

Je ne vois pas trop comment faire en javascript...

7

En javascript, tu peux utiliser "split"
avatar

8

<?php function countArray($foo) { $array = array(); foreach ($foo as $f) { if (array_key_exists($f, $array) == TRUE) { $array[$f]++; } else { $array[$f] = 1; } } return $array; } $content = ''; $sql = "SELECT content FROM table"; $query = mysql_query($sql); while ($result = mysql_fetch_array($query)) { $content .= $result['content'] . '|'; } $explode = explode('|', $content); print_r(countArray($explode)); ?>

me donne

Array ( [Haricots] => 4 [Pomme de terre] => 1 [Carotte] => 2 [Navets] => 2 [Tomate] => 2 [Poivrons] => 1 [Sauce] => 1 [Poivre] => 1 [Sel] => 1 [Gimgembre] => 1 [] => 1 )

9

azerty_tux (./6) :
Je rappelle que ce sont des checkbox
C’était pas marqué wink !

En fait, même avec cette restriction, je ne vois rien de simple, je pense que tu ne couperas pas à la fonction, qu’elle soit Javascript… ou SQL wink.
Cf. http://www.experts-exchange.com/Databases/Microsoft_SQL_Server/Q_20755773.html tout en bas de page : les 3 fonctions de split proposées font normalement la même chose que l’explode() PHP.
avatarJe ne suis pas développeur Java : je suis artiste Java.
Ce que l’on conçoit bien s’énonce clairement, / Et le code pour l’écrire arrive aisément.
Hâtez-vous lentement ; toujours, avec méthode, / Vingt fois dans l’IDE travaillez votre code.
La perfection est atteinte, non pas lorsqu’il n’y a plus rien à ajouter, mais lorsqu’il n’y a plus rien à retirer.
You don't use science to show that you're right, you use science to become right.