Recherche mysql

Résolu
Signaler
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015
-
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
-
Bonjour, j'ai dans ma db un champ contenant plusieur mot sous cette forme:
Salut;Bob;Ginette

exemple ;)


jaimerais connaitre la requette me permettant de chercher le nombre de fois que Bob a été enregistrer dans la db...

J'ai bien penser a appliquer la fonction split sur chaque entrer une par une, mais je crain qu'a la longue sa ne devienne un trop bourrin.
Quelqun a une idée?
Merci

18 réponses

Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Salut,

Peut être qu'un simple
SELECT COUNT(nom) FROM ta_table WHERE nom LIKE '%bob%'

pourrait convenir, mais pour ça il faudrait en connaitre bien d'avantage sur la fonctionnalité exacte de ta table.
A vue de nez c'est une mauvaise idée si tu as par exemple un truc comme
Salut;Boby;Ginette

mais ce sera avec certitude un beau BORDEL!

Je ne suis pas d'accord
Et côté performance je parierai bien que c'est bien plus rapide qu'un traitement php.

Un simple truc comme ça par exemple :
SELECT COUNT(nom) 
FROM ta_table
WHERE nom REGEXP '(^|;)bob($|;)'


Par ailleurs il y a peut être une réflexion à mener sur la structure de tes tables qui t'amène dans le cas présent (et si j'ai bien compris) à mettre plusieurs données dans un même champ.


Cordialement,

Kohntark -
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
53
Bonjour,

- Bon tu récupere en amont le champs de la table qui t'intéresse donc mysql_query() blabla....
- Et dans la boucle while,
<?php
$array = explode(";", $row[machintruc]);
$arraycount = array_count_values($array);
?>


- Après avoir finit le parcours de la BD :
<?php
foreach($arraycount as $value_search=> $stat)
{
  if ($value_search=='bob')
  {
    print 'Bob est afficher : '.$stat; 
   exit();
  }
}
?>


Bon c'est juste une idée...
______________________________________________________________________
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

Fonctionelle ces sure mais c'est pour un script de gestion de contrat asser important, sur le long terme, j'ai peur que lorsqu'il aura servit il ne ralentisse de façon drastique...

Il y a t'il une requete sql servant a cela?
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
8
SELECT COUNT(nom) FROM ta_table WHERE nom = 'bob'


devrait faire l'affaire (de tête: tu pourrais aussi utiliser GROUP BY nom en fin de requête pour faire le listing de combien de chaque nom tu a.... le résultat devrait être de type INT/BIGINT)

J'espère cque c'est ça!
- Pysco68
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

Comme sa, sa fait pas que chercher le mot bob?
Je veut dire cette requete ne trouvera pas bob dans Salut;bob;Ginette non?
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
8
Possible faudrait essayer. J'ai pas d'environnement de développement sous la main. Mais théoriquement ça devrais retourner NULL


- Pysco68
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
8
Ah merde je viens de te relire....

Je partais de l'avis que tu avais une table, qui avais une colonne "nom" et qu'il y avais plusieurs entrée contenant "bob" par exemple.

Clarifie une fois ta structure de données
- Pysco68
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

Je test demain mais je doute, anyway chu pas en état de coder maintenant ;)
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

A dsl, je croyais avoir été claire mais effectivement sa peut porter a confusion.

Donc j'ai le champ Nom et les ligne ressemble a sa:

Salut;Bob;Ginette
Salut;Ginette
Bob;Ginette
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
8
J'ai bien peur que pour ce coup là la version qu'avais proposée phpAnonyme soit la plus facile... sinon tu peux t'amuser avec les Expressions Régulières dans MySQL, mais ce sera avec certitude un beau BORDEL!

http://dev.mysql.com/doc/refman/5.0/en/regexp.html si jamais tu est masoschiste (je le suis :P enfin pour ce coup là ;)


- Pysco68
Messages postés
681
Date d'inscription
samedi 26 février 2005
Statut
Membre
Dernière intervention
21 août 2014
8
@ Kohntark: re :)

Ben enfait, admettons que nous avons par exemple: "bob;ginette;mark;bob" dans notre champs, ta requête ne retournera que '1' puisque tu ne traite pas les éventuelles récurrences (j'ai admis qu'il pouvait y en avoir)...

Il quasi nécessaire d'utiliser une procédure enregistrée. Enfin je crois :P
Si parcontre il n'y a qu'une seule occurrence du mot à chercher pas chaine, ta version marche très bien ;)


- Pysco68
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
(j'ai admis qu'il pouvait y en avoir)...

Oui, c'est pour cela que j'attirais l'attention sur le fait d'en connaitre plus sur la fonctionnalité de la table, parce que pour l'heure on ne connait que très peu de choses et nous ne pouvons faire que des suppositions.
Pour éviter d'en faire trop je ne me suis basé que sur les exemples fournis.

D'ailleurs même ton exemple reste une extrapolation, peut être recherche t il le nombre de fois où Bob apparait dans chaque enregistrement(du style nombre de fois où Bob est intervenu dans un contrat, chaque enregistrement en représentant un)
C'est également une extrapolation

Bref, à toi Dav_c


Cordialement,


Kohntark -
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

"SELECT COUNT(Contrat_Employer_actif) FROM renox_contrats WHERE Contrat_Employer_actif LIKE '%;".$User.";%'"

Merci sa marche nikel, sa l'évite de devoir faire un boucle pour chaque contrat...
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

A oui j'allais oublier chaque nom devra être unique donc pas besoin de vérifié s'il apparait 2 fois dans une meme ligne.
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Je me répète mais fais très attention avec cette solution, elle ne fonctionnera pas correctement si tu as des noms qui contiennent la même chaîne de caractères :
bob / bobby
sylvain / sylvaine
dupont / dupontel
etc ...



Kohntark -
Messages postés
194
Date d'inscription
dimanche 25 janvier 2004
Statut
Membre
Dernière intervention
11 décembre 2015

oui mais jai contourner le probleme en rajoutant un ; devant ma chaine et ma requete cherche ;bob; et non bob
Messages postés
392
Date d'inscription
mercredi 28 octobre 2009
Statut
Membre
Dernière intervention
23 mars 2012
53
[quote=Tu]oui mais jai contourner le probleme en rajoutant un ; devant ma chaine et ma requete cherche ;bob; et non bob/quote
Ben en faite sa change pas grand chose...Tout t'es client ne s'appelleront pas bob, il y aura comme te l'a dit kohntark des dérivés de noms et ça sera un problème. Donc ;bob;bobby;.... il y a toujours bob dans le nom et il est compris dans les séparateurs...


______________________________________________________________________
Messages postés
3706
Date d'inscription
lundi 5 juillet 2004
Statut
Membre
Dernière intervention
27 avril 2012
30
Au temps pour moi, je n'avais pas prêté attention au
LIKE '%;".$User.";%'"

Mais je suis rassuré, je crois bien que PhpAnonyme a loupé également

J'ai par contre toujours des doutes sur le fait que ta structure de DB soit bien construite.

Bonne continuation,


Kohntark -