select distinct plusieurs champs + liste déroulante

Invité
Invité n'ayant pas de compte PHPfrance

05 avr. 2007, 10:52

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.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 avr. 2007, 11:26

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 170 Messages

05 avr. 2007, 11:34

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"
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

05 avr. 2007, 11:46

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 :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

05 avr. 2007, 11:51

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.

Invité
Invité n'ayant pas de compte PHPfrance

05 avr. 2007, 12:17

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?

Invité
Invité n'ayant pas de compte PHPfrance

05 avr. 2007, 12:24

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.

Eléphant du PHP | 170 Messages

05 avr. 2007, 13:06

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)
Benjamin Franklin a dit :
Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends