[RESOLU] N'afficher que la première valeur d'une table MySQL correspondante à une condition

Eléphanteau du PHP | 18 Messages

11 oct. 2018, 14:06

Bonjour,
Je cherche a afficher la première valeur d'une table MySql correspondant à une condition. J'ai beau chercher sur le Forum et le Net, mais je n'ai pas trouvé.
J'ai une table MySql de ce type
Image
Bien sur le nombre d'animateurs est variable et je voudrais afficher une seul fois le titre "Membre"
Image
J'ai ébauché ce code (Sans la mise en page):

Code : Tout sélectionner

if ($Titre != "Membres") { echo $Titre; echo $nom; } else { echo $nom; }
Mais bien sur la je n'affiche pas du tous le Titre "Membre"
Merci d'avance pour votre aide
Patrick

Avatar du membre
Eléphanteau du PHP | 25 Messages

11 oct. 2018, 14:18

Tu fais ta requête MySQL avec un LIMIT 1 dans la condition...
SELECT id FROM tatable WHERE titre = ? LIMIT 1, ['tontitre']; 


Si tu fais ça via PHP et non via MySQL tu vas perdre en perfs/rapidité, c'est pas fait pour ça.

Eléphanteau du PHP | 18 Messages

11 oct. 2018, 16:37

Bonjour Reka et merci pour ta réponse.
Mais je comprends pas : Si je limite a 1 le nombre de ligne comment je fait pour afficher les Nom5 à Nom13 ?
(Voir image Affichage souhaité dans mon premier post)
Patrick

Avatar du membre
Eléphanteau du PHP | 25 Messages

11 oct. 2018, 17:00

Ha oui, ton titre m'a induite en erreur.

Ton exemple me décontenance, parce que tu utilises animateur deux fois avec deux casses différentes.
Par ailleurs, pour une DB optimisée, il faudrait que t'externalises à mon sens les titres-rôles et aies des foreign keys dans ta table principale, mais peu importe.

Tu peux donc faire ta requête en deux fois, je pense ? :
$values = $bdd->query('SELECT distinct(titre) FROM users')->fetchAll();
// ou encore :   $values = $bdd->query('SELECT titre FROM users GROUP BY titre')->fetch();
// te ramène tous les titres existants
puis
foreach ($values as $value) {
  $result = $bdd->query('SELECT id, titre, nom FROM users WHERE titre = ?, [$value];')->fetchAll();

}
// va chercher tous les membres associés au titre correspondant

Il y a sûrement moyen de le faire plus directement, mais je pense que c'est une possibilité...

Bonne chance.

Eléphanteau du PHP | 18 Messages

11 oct. 2018, 17:14

Mon code que j'ai fais il y a quelques années :

Code : Tout sélectionner

<?php try { $bdd = new PDO('mysql:host=yyy ;dbname=XXXXX', 'root'); } catch(Exception $e) { die('Erreur : '.$e->getMessage()); } $req1 = $bdd->query('SELECT * FROM matable'); while ($donnees = $req1->fetch()) { $id = $donnees['id']; $nom= $donnees['Nom]; $titre = $donnees['Titre'];
Depuis, J'avoue avoir un peu déconecté du php et je ne comprendre tous.
Est-ce que tu peux inclure ta requête dans ce code ?
Merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7701 Messages

15 oct. 2018, 14:09

Moi j'aurai conservé ton code tel quel et c'est uniquement au moment de l'affichage du titre que je testerai si je l'ai déjà affiché précédemment ou pas.

En gros :
1) je crée un tableau vide avant ma boucle : $tablo_titres_deja_vu=array();
2) au moment de l'affichage du titre, je regarde si le titre que je m'apprête à afficher est déjà dans le tableau de ceux déjà croisés (avec la fonction in_array() )
Deux possibilités :
2.a) C'est la 1ère fois que je vois ce titre et donc je l'affiche + je l'ajoute au tableau
2.b) Ce titre existe dans le tableau, c'est donc que je l'ai déjà affiché précédemment et du coup je ne le réaffiche pas.

Important : tu devrais ajouter à ta requête SQL une clause ORDER BY Titre pour éviter d'avoir des animateurs et membres mélangés
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 18 Messages

15 oct. 2018, 18:15

Bonjour Arthur,
merci pour ta réponse.
Je vais étudier ta proposition, car elle est probablement plus propre que ma solution car pour le moment j'ai résolu le problème en comptant (COUNT) le nombre animatrice et d'animateur et j'affiche d'ans l'ordre "animatrice, animateur puis membre" et pour membre j’affiche le titre que pour id = Nombre Animateur + animatrice + 1 (C'est très basique, mais ça marche)
MB : "ORDER BY Titre" me mettrais les animateurs avant les animatrices (C'est gênant pour les réglés de galanterie)
Mais pour apprendre je essayer de mettre en oeuvre ta proposition.
Merci encore

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 7701 Messages

15 oct. 2018, 19:54

Petite astuce, tu peux indiquer dans la clause ORDER BY l'ordre dans lequel il doit afficher les éléments afin de respecter la galanterie :-D
SELECT * FROM ... ORDER BY FIELD(Titre, 'animatrice', 'animateur', 'membre')
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphanteau du PHP | 18 Messages

15 oct. 2018, 20:50

Super,
Merci beaucoup pour ce complément d'utilisation de ORDER BY. Je ne connaissais pas. (mais il y a tant de chose que je ne connait pas en PHP. :( )