[MySQL] LIKE entre deux champs

Eléphant du PHP | 67 Messages

12 avr. 2006, 13:06

Bonjour,

Mon souci est sans doute tout con mais je n'arrive pas à trouver. Explications:

J'ai 2 tables:
TABLE1: contient un ID à incrémentation automatique
TABLE2: contient un champ contenant certains de ces ID de cette façon: "ID1 - ID2 - ID4 -".

Je voudrais ressortir grâce à une requête les données de TABLE1 donc l'ID est contenu dans le champ en question de TABLE1.

Je tourne en rond depuis un moment malgré mes recherches, un truc tout bête doit m'échapper, donc... A l'aide! ;)

Merci.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

12 avr. 2006, 13:59

J'ai une bonne nouvelle pour toi, tu peux oublier ILIKE :)

À la place, crée une nouvelle table en charge de faire la relation entre les IDs. On appelle ça "normaliser" les données. En cherchant dans la FAQ et/ou Google tu dois pouvoir trouver un tutorial sur la "normalisation" et les "formes normalisées" ("normal form").

Pour l'exemple, imaginons que tu souhaites stocker la relation entre des profs et des élèves. Tu vas créer une table "profs" (prof_id, prof_nom, prof_prenom), une table "eleves" (eleve_id, eleve_nom, eleve_prenom) et une table "rel_prof_eleve" (prof_id, eleve_id). profs.prof_id et eleves.eleve_id seront des ID auto-incrémentées (clé PRIMARY) et l'index PRIMARY de "rel_prof_eleve" sera (prof_id, eleve_id). Selon tes besoins tu devras également créer un index sur rel_prof_eleve.eleve_id. Pour connaître les noms de tous les élèves d'un prof:

Code : Tout sélectionner

SELECT e.eleve_nom, e.eleve_prenom FROM rel_prof_eleve rel, eleves e WHERE rel.prof_id = 123 AND e.elve_id = rel.eleve_id

Eléphant du PHP | 67 Messages

12 avr. 2006, 17:49

Ok, merci beaucoup pour cette aide, je pensais vraiment que c'était possible avec LIKE mais bon, tant pis. :)

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

13 avr. 2006, 05:09

Oui bien sûr, c'est possible mais particulièrement déconseillé. Et quand je dis "déconseillé" c'est un euphémisme. Pour te donner une idée du niveau de déconseillation c'est à peu près comme ouvrir une boîte de thon avec un tournevis et un marteau. Gustave Parking le fait bien lui, mais c'est ce qui fait son charme. :D

La normalisation des données est l'outil le mieux adapté, en fait c'est le seul qui soit adapté. Dit comme ça, "normalisation" peut faire peur au début mais tu l'as vu: derrière le mot se cache une idée très simple. Au lieu de faire ("a", "b1,b2,b3") et devoir recourir à des solutions compliquées comme ILIKE tu as ("a", "b1"), ("a", "b2"), ("a", "b3") et tes requêtes restent très simples et très rapides. Sans oublier le risque d'erreur qui est considérablement réduit puisque tu ne peux pas stocker 2 fois ("a", "b1") ou te tromper dans la formulation du ILIKE ou REGEXP. Et je ne parle même pas de ce qu'on appelle l'intégrité des données: dans l'exemple, que se passe-t'il si un élève change d'établissement ?

Forme normale

Code : Tout sélectionner

DELETE FROM rel_prof_eleve WHERE eleve_id = 123
Pas-normale:

Code : Tout sélectionner

UPDATE table SET liste_ids = REPLACE(',123,', ',', liste_ids) WHERE liste_ids LIKE '%,123,%'; UPDATE table SET liste_ids = SUBSTRING(liste_ids, 4) WHERE liste_ids LIKE '123,%'; UPDATE table SET liste_ids = SUBSTRING(liste_ids, -4) WHERE liste_ids LIKE '%,123'; DELETE FROM table WHERE liste_ids IN ('123', '')
HTH :)