Implode

Petit nouveau ! | 2 Messages

11 oct. 2007, 23:39

Bonsoir,

Dans une table j'ai inséré une liste de numéro séparé par un "|" en utilisant un implode. Ces numéros correspondent à des ID d'une autre table.

Je cherche maintenant à trier ces numéros pour sortir que ceux dont j'ai besoin selon un where mais je ne sais pas comment faire.

J'espere avoir ete clair :? , c'est la 1ere fois que je tentais un implode et la je ne sais pas ou aller ni ou chercher (manque de vocabulaire technique pour faire une bonne recherche)

Merci

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

12 oct. 2007, 01:03

[...] ceux dont j'ai besoin selon un where mais je ne sais pas comment faire.
Désolé de te le dire, mais on a à peu près un ou deux messages du genre par mois et ça ne se termine jamais très bien.

Oublie définitivement l'idée d'utiliser cette colonne dans une clause WHERE et crée une table de relation pour lier les deux tables.

Au lieu d'avoir un enregistrement

Code : Tout sélectionner

4 1|2|3
tu auras 3 enregistrements

Code : Tout sélectionner

4 1 4 2 4 3
Le concept s'appelle "normalisation", et il est au cœur du langage SQL.

Petit nouveau ! | 2 Messages

14 oct. 2007, 12:26

Salut, en fait j'ai changé mon enregistrement au lieu d'avoir des "|" je les ai remplacé par des "," puis pour le trie dans la requête je fais "where in ( )" et ca fonctionne.

ViPHP
ViPHP | 5924 Messages

14 oct. 2007, 15:45

Permet moi d'être perplexe :

Code : Tout sélectionner

mysql> CREATE TABLE implode ( id TINYINT UNSIGNED AUTO_INCREMENT, list VARCHAR(255), PRIMARY KEY (id) ); Query OK, 0 rows affected (0.08 sec) mysql> INSERT INTO implode VALUES(NULL, "1,2,3,4"); Query OK, 1 row affected (0.08 sec) mysql> SELECT * FROM implode WHERE "2" IN(list); Empty set (0.00 sec)
J'ai essayé avec les types MYISAM et INNODB sous "Server version: 5.0.45 MySQL Community Server (GPL)", aucun n'a l'air d'avoir le comportement que tu nous dis.

Invité
Invité n'ayant pas de compte PHPfrance

14 oct. 2007, 15:52

Attention je suis débutant mais comparé à ta requête l'implode n'est pas placé dedans.

L'enregistrement dans la base
	$rep = implode($rep, ',');
	$update = "insert into renc values ('', '".$uid."', '".$rep."')";
	mysql_query($update) or die(mysql_error());
Dans mon champ j'ai une liste de numéro qui représnetnt des ID (2,10,26,33,45,...)
Et pour l'affichage trié
	$res=mysql_query("select * from renc_rep where id IN ($id_rep) order by id_ques");
	while (list($id,$id_cat,$id_ques,$rep) = mysql_fetch_row($res)) {

ViPHP
ViPHP | 5924 Messages

14 oct. 2007, 16:16

Non, ca n'a rien à voir avec cela, on a tous les 2 la même structure de données.
C'est juste que tu fais une sélection des données de ta première table pour ensuite faire une sélection dans ta seconde table.
Toujours est-il que c'est le même problème, c'est une mauvaise schématisation des tables, tu te prives de toutes les fonctionnalités du serveur. Notamment ici, tu pourrais tout sélectionner en une seule requète.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

14 oct. 2007, 16:33

Mouais, en fait on ne parle pas de la même chose, ce que cherchais l'ami plouf c'est str_replace(). Bah, j'imagine qu'on aura l'occasion de lui reparler de la normalisation à son prochain sujet (spoiler alert: la réponse est FIND_IN_SET()).