Page 1 sur 1

Requete croisée impossible

Posté : 14 mai 2007, 00:32
par DoubleClic
Bonsoir à tous,

J'ai problème insoluble pour mon petit niveau.
Je m'explique, j'ai une table avec un champ qui contient des id séparés par un caractère et une deuxième table avec des enregistrement qui ont un id commun à ceux du résultat de la première requète.
Ma recherche c'est de lister les résultats uniques

première requete
$req1=mysql_db_query($db,"SELECT liste FROM table1 WHERE id1='$_GET[id1]'");
$res1=mysql_fetch_assoc($req1);
$resultat1=explode('|', $res1['liste']);
J'obtiens bien la liste des id
Ensuite je souhaite dans une autre table trouver les id différent du premier résultat.
$req2=mysql_db_query($db,"SELECT id2,nom FROM table2 WHERE NOT IN $resultat1");
while($res2=mysql_fetch_assoc($req2))
{echo $id";}
La deuxieme requete n'est pas bonne mais c'est pour vous montrer ou je veux en venir.

J'espère avoir été assez clair pour que vous compreniez.

Merci d'avance à ceux qui répondront.

Patrick

Posté : 14 mai 2007, 05:21
par Xenon_54
Bonjour,

Est-ce que les ID de la table "B" sont déjà connus et immuables?
Si oui, tu pourrais alors utiliser le type ENUM() et ensuite effectuer une sous-requête avec ta condition de sélection WHERE.

Si le nombre d'ID n'est pas connu et est variable, il faudrait alors créer une 3e table contenant les ID contenues dans la liste de chaque enregistrement de ta table A. Les sous-requêtes peuvent donc encore être utilisée pour la sélection finale.

Requete croisée impossible

Posté : 14 mai 2007, 08:10
par DoubleClic
Les résultats de la requete1 peuvent être différent alors que les id de la table b sont des numéros autoincrémentés donc connus mais ça change à chaque fois que j'ajoute un enregistrement.

Pour la sous requete where je n'arrive pas à la faire car pour extraire le résultat1 il faut déjà passer par une boucle for et je ne peux pas faire une autre boucle à l'intérieur sinon les résultats se multiplient.

Merci

Posté : 14 mai 2007, 08:28
par Invité
Voici la réponse, ça peut toujours servir.

Code : Tout sélectionner

$req1=mysql_db_query($db,"SELECT liste FROM table1 WHERE id1='$_GET[id1]'"); $res1=mysql_fetch_assoc($req1); $resultat1=str_replace("|", ",", $res1['liste']); $req2=mysql_db_query($db,"SELECT id2,nom FROM table2 WHERE id2 NOT IN ('$resultat1')"); while($res2=mysql_fetch_assoc($req2)) {echo $res2[nom];}
Merci de votre aide.

Posté : 14 mai 2007, 10:23
par iclo
Sans vouloir être méchant, je dirais quand même que le design de la base de donnée pourrait être amélioré en la normalisant, ce qui permettrait de réduire le nombre de requêttes lancées sur le serveur.
Il n'est pas du tout optimal, d'avoir des listes de valeur dans un champs, il faudrait ajouter une table pour stocker ces différentes valeurs, avec un champ faisant le lien avec l'autre table.


Table A id(la table que tu as qui pour le moment contient la liste d'attribut)
Table B id IdTableA.

Ainsi un enregistrement de la table A peut contenir 0,1 ou plusieurs id dans la table B.

Ca permettra surement de faire ce que tu veux en une seule requête. (Très appréciable, si tu as beaucoup d'enregistrement ou que le script est utilisé souvent)

Posté : 14 mai 2007, 12:08
par DoubleClic
Merci pour ces précisions.

En effet je réfléchis à créer une table de lisaison entre les deux tables.

Merci