[RESOLU] Ne rechercher que des champs numériques

Eléphant du PHP | 159 Messages

12 janv. 2017, 16:38

Hello,

J'ai ma requête suivante :
SELECT table3.jobticket as jobticket,
		table3.id as idDossier,
		table3.name as nomDossier,
		table4.name as nomClient,
		table4.reference as refClient,
		table3.delivery_date as dateSortie
		FROM quote table3, customer table4
		WHERE table3.customer_id=table4.id
		AND table3.jobticket LIKE '1%'
		AND table3.jobticket > '170005'
		GROUP BY table3.jobticket
Je trouve les résultats :

Code : Tout sélectionner

170006 170007 170008 170009 170010 170011 170012 170013 18-OFR0014 180-CMD0030 1816-OFR1799 1844-OFR1819 1868-CMD0053 1899-OFR1874 1904-OFR1879 1971-OFR1945 1976-OFR1950 1988-OFR1962 1991-OFR1963
Vous l'aurez bien compris, seuls les résultats numériques m'intéressent, comment modifier ma requête ?

Merciiiiiiii

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 13232 Messages

12 janv. 2017, 17:38

Ah, MySQL et sa gestion des types :P

La seule solution qui me vient à l'esprit est de faire une expression régulière pour ne remonter que les valeurs totalement numériques.
Par contre, ces expressions régulières ont un coût en terme d'exécution, et je pense qu'il faudrait faire attention à l'EXPLAIN PLAN.

Voici une idée de ce que j'ai en tête (je te laisse valider sur ton jeu de données, je n'ai pas exécuté la requête) :
SELECT
      table3.jobticket as jobticket,
      table3.id as idDossier,
      table3.name as nomDossier,
      table4.name as nomClient,
      table4.reference as refClient,
      table3.delivery_date as dateSortie
FROM 
      quote table3, 
      LEFT JOIN customer table4 ON table3.customer_id=table4.id
WHERE 
      table3.jobticket REGEXP '1[0-9]*'
      AND table3.jobticket > '170005'
GROUP BY 
      table3.jobticket
NB : tu noteras que j'ai modifié la jointure
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 159 Messages

12 janv. 2017, 17:59

Merci pour ta réponse, mais il m'affiche encore plus de résultats "non souhaités" :'(

Eléphant du PHP | 159 Messages

12 janv. 2017, 18:08

J'ai trouvé une solution !

Code : Tout sélectionner

AND LENGTH(table3.jobticket) = '6'

Avatar de l’utilisateur
Administrateur PHPfrance
Administrateur PHPfrance | 13232 Messages

12 janv. 2017, 18:41

Excuses-moi, j'ai oublié un truc, en effet :
SELECT
      table3.jobticket as jobticket,
      table3.id as idDossier,
      table3.name as nomDossier,
      table4.name as nomClient,
      table4.reference as refClient,
      table3.delivery_date as dateSortie
FROM 
      quote table3, 
      LEFT JOIN customer table4 ON table3.customer_id=table4.id
WHERE 
      table3.jobticket REGEXP '^1[0-9]*$'
      AND table3.jobticket > '170005'
GROUP BY 
      table3.jobticket
Ma précédente expression régulière ne faisait que tester la présence d'un nombre dans la chaine.
Maintenant, elle teste que la chaine ne contient QUE un nombre.
Par contre, ta solution ne marchera plus le jour où la taille du nombre passe à 7.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer