Page 1 sur 1

select distinct plusieurs champs + liste déroulante

Posté : 05 avr. 2007, 10:52
par Invité
Bonjour à tout le monde!

Je reviens vers vous car j'ai un soucis pour réaliser une liste déroulante.

J'ai une table (tbl_activsport) qui répertorie des activités sportives dans deux champs: type_activsport1 et type_activsport2. Ces derniers correspondent aux deux activités principales proposées par des entreprises.

J'ai besoin de récupérer les valeurs de ces deux champs afin de dresser une liste déroulante qui permettra par la suite, sur une page repertoriant toutes les entreprises, de filtrer selon les activités.

Ainsi, dans cette liste déroulante, on trouvera à la fois les activités présentes dans le champ type_activsport1 mais aussi dans le champ type_activsport2. et pour éviter les doublons, faire un SELECT DISTINCT.

Jusqu'à présent, pour générer les valeurs comprises dans les deux champs, j'ai fais la requete suivante:
$query_rs_type = "SELECT DISTINCT type_activsport1, type_activsport2 FROM tbl_activsport"
Mais cela ne semble pas enlever les doublons, il recupère toutes les valeurs.

Et comment faire par la suite pour stocker les valeurs dans une seule liste déroulante?

Si quelqu'un peut m'aider, merci par avance.

Posté : 05 avr. 2007, 11:26
par Ryle
Ton problème vient du fait que ta requête te retourne les couples "type_activsport1, type_activsport2" distinct et tu te retrouve donc avec des doublons :)

Le plus simple est à mon avis de faire une UNION entre deux requêtes qui iront chacune chercher les libellés distinct de tes deux champs. L'union ne ramera que les valeurs distinctes entre tes deux requêtes, donc en cas de doublons entre les deux champs, un seul libellé sera retourné.

Si jamais tu avais besoin pour des questions d'id ou autre d'empêcher le distinct entre les deux champs, il te suffit d'utiliser UNION ALL entre tes deux requêtes :)

Posté : 05 avr. 2007, 11:34
par Expreg
Ryle, je peux me tromper, mais je ne suis pas certain que ça fonctionne, il y a un problème d'égalité !
Si distinct(categorie1) ramène 10 valeurs et distinct(categorie2) ramène 12 valeurs, ça va pas le faire.

Perso je pense qu'il doit passer par GROUP BY et faire un tri à la sortie (array_unique par exemple)
$req="select categorie1,categorie2 form latable group by categorie1, categeorie2"

Posté : 05 avr. 2007, 11:46
par Ryle
Normalement il ne devrait pas y avoir de soucis, la fonction union est faite pour regrouper et distinguer les données des différentes requêtes :) En gros, il exécute de façon indépendante les requêtes et concatène les résultats en une seule liste quel que soit le nombre d'enregistrements de chacune. On pourrait donc très bien ne pas avoir de résultat dans la première et 10 dans la seconde, et en retrouver 10 au total ;)

La seule contrainte, c'est que les types de champs doivent être les mêmes dans les deux requêtes (on ne peut pas "unioner" un int et un varchar, mais on peut les caster) ce qui n'est à priori pas un problème ici :)

Posté : 05 avr. 2007, 11:51
par Invité
ok. Merci pour vos réponses. Je vais creuser du côté de la solution de Ryle pour commencer et je referai part de mes avancées.

Posté : 05 avr. 2007, 12:17
par Invité
Il semblerait que ta solution Ryle fonctionne parfaitement. Je vais donc rester sur celle-ci. Je l'ai testé avec des doublons et pas de soucis.

Par contre, je laisse la possibilité de choisir "aucune activité" pour le champ type_activsport2 qui se résulte par une valeur = ''.

Et le SELECT DISTINCT le prend en compte, ce qui fait que ma liste déroulante contient à présent un choix vide. Comment faire pour l'enlever ou l'exclure du SELECT dans ma requete?

Posté : 05 avr. 2007, 12:24
par Invité
Obliez ma derbière question, j'ai trouvé la solution en faisant dans ma requete:
SELECT DISTINCT type_activsport1 FROM tbl_activsport UNION SELECT DISTINCT type_activsport2 FROM tbl_activsport WHERE type_activsport2 != ''
Ca m'apprendra à poster avant de me creuser un peu la tête.
Merci pour tout en tout cas.
Bonne continuation à tout le monde.
Si quelqu'un peut me mettre résolu svp.

Posté : 05 avr. 2007, 13:06
par Expreg
la fonction union est faite pour regrouper et distinguer les données des différentes requêtes :)
Aaaaaaah, j'ai lu en diagonale !
Scuse, bah oui UNION (2 requêtes en effet)