[MySQL] LIKE entre deux champs

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [MySQL] LIKE entre deux champs

par Hubert Roksor » 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 :)

par Furax » 12 avr. 2006, 17:49

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

par Hubert Roksor » 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

[MySQL] LIKE entre deux champs

par Furax » 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.