Page 1 sur 2

Affichage 1 fois et non n fois

Posté : 01 juil. 2009, 08:42
par cmoi
Bonjour,

je cherche à améliorer une page. Ce bout de code
<?php echo $row['ville'] ?>
m'affiche les villes. Mais il affiche la ville autant de fois qu'elle apparaît dans la base. Si "Nice" figure 10 fois, j'aurais 10 lignes pour "Nice".

Comment faire pour que chaque ville n'apparaisse qu'une seule fois ?
Merci pour votre aide.

Posté : 01 juil. 2009, 08:59
par stopher
Salut ,

Regardes plutôt du coté de ta requête sql , soit par un GROUP BY ou DISTINCT selon le reste de ta requête .

Ch.

Posté : 01 juil. 2009, 09:20
par cmoi
Ma requête se présente ainsi
$sql = "SELECT *FROM {$tablename} ORDER BY {$order_by} {$order_dir}";
Elle devient
$sql = "SELECT * FROM {$tablename} GROUP BY ville ORDER BY {$order_by} {$order_dir} ";
Question subsidiaire : j'ai la même question pour les activités. Comment j'ajoute le champ activite à côté de ville dans ma requête ? J'ai essayé entre parenthèses mais ça ne marche pas.

Posté : 01 juil. 2009, 09:30
par stopher
Distinct s'utilise comme ceci par exemple :
select 
    distinct( utilisateurs.nom ),
    utilisateurs.prenom,
    utilisateurs.etat 
from 
    mabase.utilisateurs

Posté : 01 juil. 2009, 09:40
par cmoi
finalement avec GROUP BY ça fonctionne mais comment appliquer sur 2 valeurs ?

Posté : 01 juil. 2009, 09:43
par stopher
Comme ceci :

group by champ1, champ2 , champx

Posté : 01 juil. 2009, 10:02
par albat
1. Éviter le SELECT * et préciser les champs souhaités (ville)
2. Dans cet exemple, le DISTINCT est plus optimisé que le GROUP BY
$sql = "SELECT ville FROM table GROUP BY ville";  // Correct, sans plus
$sql = "SELECT DISTINCT ville FROM table";        // Optimisé

Posté : 01 juil. 2009, 11:06
par cmoi
ok pour cette écriture
$sql = "SELECT DISTINCT ville FROM table";
mais quand j'ajoute un 2e DISTINCT ?

Si j'écris DISTINCT ville, activite, la page s'affiche mais sans tenir compte de ma requête.

Posté : 01 juil. 2009, 11:11
par sylvaing26
et comme ca ?
$sql = "SELECT DISTINCT 'ville', 'activite' FROM table"; 

Posté : 01 juil. 2009, 11:18
par cmoi
et comme ca ?
$sql = "SELECT DISTINCT 'ville', 'activite' FROM table"; 
Bien essayé ! Mais ça m'affiche "ville activite" :wink:

Posté : 01 juil. 2009, 11:20
par stopher
DINSTINCT fonctionne sur la ligne , pas sur une colonne ..

Il te faut donc utiliser à la fois DISTINCT pour le plus gros , et GROUP BY pour le reste ..

Apres il existe peut être d'autres façon de faire , mais n'étant pas un expert en SQL .. je ne les connais pas ..

Posté : 01 juil. 2009, 11:25
par sylvaing26
Sinon ba comme je dis ya toujours le plan demerde, certes pas optimisé ...
Deux requetes ...
$sql_ville = "SELECT DISTINCT ville FROM table";
$sql_activite = "SELECT DISTINCT activite FROM table";

Posté : 01 juil. 2009, 11:35
par cmoi
Sinon ba comme je dis ya toujours le plan demerde, certes pas optimisé ...
Deux requetes ...
$sql_ville = "SELECT DISTINCT ville FROM table";
$sql_activite = "SELECT DISTINCT activite FROM table";
ok. je fais comment pour regrouper ça dans une même requête ?

Posté : 01 juil. 2009, 11:35
par julian
Tout dépend aussi comment tu veut afficher les résultats.
Tu veux une liste unique des villes et une liste unique des activités ?
Ou tu veux conserver l'info de lien entre la ville et l'activité ?

Je suppose que deux villes peuvent être associés avec la même activité...

Posté : 01 juil. 2009, 11:36
par stopher
En fait je ne comprends pas pourquoi tu veux supprimer les doublons sur deux champs ?

En faisant ça , tu risques de passer à coté d'enregistrements qui sont pourtant diffèrent !

Ex :

1 ville => lille , activite => picole
2 ville => paris,activite => picole
3 ville => lille, activite => tourisme

Dans ces trois enregistrements , si tu supprimes les doublons sur la ville , seule l'enregistrement 1 et 2 seront retournés , puis si tu appliques un group by sur l'activité , tu n'auras au finale qu'une seul résultat !

Pourtant ils sont tous diffèrent !