Page 1 sur 1

Implode

Posté : 11 oct. 2007, 23:39
par plouf
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

Re: Implode

Posté : 12 oct. 2007, 01:03
par Hubert Roksor
[...] 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.

Posté : 14 oct. 2007, 12:26
par plouf
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.

Posté : 14 oct. 2007, 15:45
par Sékiltoyai
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.

Posté : 14 oct. 2007, 15:52
par Invité
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)) {

Posté : 14 oct. 2007, 16:16
par Sékiltoyai
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.

Posté : 14 oct. 2007, 16:33
par Hubert Roksor
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()).