8791 sujets

Développement web côté serveur, CMS

Bonjour,
Je souhaite obtenir une liste des valeurs sur des champs différents c1, c2, c3, c4 figurant dans la même table t1, sans doublons.
C'est certainement très simple mais je cale...
Merci de votre aide
Que tu interdis toute entrée dans ta base avec les memes valeurs de c1, c2, c3 et c4 à la fois.
Modifié par Vincent_nk (12 Oct 2011 - 02:01)
Je la reformule dans ce cas.
Voilà, c'est à priori très simple mais je ne vois pas la solution :

dans la table t1, j'ai trois colonnes c1,c2,c3

j'aimerais récupérer les valeurs se trouvant dans ces trois colonnes (en retirant les doublons) pour les avoir dans un menu déroulant.
Je cherche la requête...
Merci.
Je ne comprends toujours pas...
Est ce que tu veux :

- Récupérer l'ensemble des combinaisons de c1, c2 et c3 existantes dans ta table t1 ?
- Récupérer toutes les valeurs de c1, toutes les valeurs de c2, et toutes les valeurs de c3 pour les mettre dans un seul menu déroulant?
- Récupérer les valeurs de chaque colonne pour en faire des menus déroulants distincts ? (1 pour chaque colonne)

D'instinct je dirai le deuxième choix..., dans ce cas tu peux utiliser une requête dans ce style:


SELECT distinct c 
FROM ((SELECT distinct c1 as c FROM t1) 
          UNION (SELECT distinct c2 as c FROM t1) 
          UNION (SELECT distinct c3 as c FROM t1)) as tmp


Mais comme tu peux le voir c'est un peu du bricolage... tu peux aussi faire trois requêtes séparées et gérer les doublons avec ton langage de programmation. Ou alors il y a un soucis avec ton modèle de données mais tu ne donnes pas beaucoup d'infos alors pas évident de juger Smiley smile
Modifié par skywalk3r (12 Oct 2011 - 10:38)
Salut,

Ce n'est effectivement pas une requête si simple, mais en plus elle va être très gourmande en ressource.
Ton problème vient à la base d'une mauvaise conception. Au lieu d'avoir des champs c1, c2, c3, tu aurais dû avoir deux tables supplémentaires sur lesquelles tu aurais fait une jointure.

Ta structure actuelle :

table1(id, c1, c2, c3)


Une structure optimisée et évolutive :

table1(id)
table_join(id_table1, id_table_c)
table_c(id, libelle)
je ne pense pas que ce soit possible dans mon cas car :
- chaque id de la table 1 peut avoir une combinaison différente de c1, c2, et c3

par contre, ta proposition fonctionne sans table_join puisque je peux créer une table_c avec toutes les entrées et faire une jointure t1.c1=table_c.id AND t1.c2=table_c.id AND t1.c3=table_c.id
J'ai donc changé ma conception :

table t1 avec c1ID, c2ID, c3ID
table c avec id et info

comment faire pour que c1ID, c2ID et c3ID donnent chacun leur valeur c.info

j'ai la jointure classique mais la suite je cale...

SELECT info FROM c, t1 WHERE c1ID=c.id  
Et donc, qu'est-ce qui ne va pas ? Ta requête te retourne bien le champ info que tu veux non ?


Et puis je te propose une structure évolutive que tu peux tout à fait mettre en place, contrairement à ce que tu dis.
oui je pense que ça peut fonctionner ainsi et il est certain que c'est plus optimisé
merci de ton aide
Si tu cherches a interroger ta table t1 en remontant les libellés ça doit plutôt ressembler à ça.
Au passage, ça ne prend pas de ressource que de donner un nom à tes tables, les noms courts comme ceux la on les utilise pour aliaser les tables... Smiley smile


SELECT aliast1.*, aliasc1.info as c1, aliasc2.info as c2, aliasc3.info as c3
FROM t1 aliast1
  JOIN c aliasc1 ON aliast1.c1ID = aliasc1.id
  JOIN c aliasc2 ON aliast1.c2ID = aliasc2.id
  JOIN c aliasc3 ON aliast1.c3ID = aliasc3.id


Conseil : Utiliser JOIN pour faire les jointures plutôt que WHERE