Rangement GROUP BY
T-SonS
Messages postés
233
Date d'inscription
Statut
Membre
Dernière intervention
-
T-SonS Messages postés 233 Date d'inscription Statut Membre Dernière intervention -
T-SonS Messages postés 233 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'ai un soucis avec un système de MPs que j'ai mis en place et sur lequel il m'est impossible d'arriver au tri désiré mal-grès les heures passées dessus...
la table est donc
+---+----+--------------+----------+----------------+-----------+-------+-------------+----------+
| id | cid | expediteur | exp_lvl | destinataire | dest_lvl | titre | message | heure |
+---+----+--------------+----------+----------------+-----------+-------+-------------+----------+
| 1 | 1 | pseudo1 | 0 | pseudo 2 | 0 | titre1| message1| 10h |
| 2 | 2 | pseudo3 | 0 | pseudo 1 | 0 | titre2| message2| 13h |
| 3 | 2 | pseudo1 | 0 | pseudo 3 | 0 | titre2| message3| 15h |
| 4 | 3 | pseudo4 | 0 | pseudo 1 | 0 | titre3| message4| 18h |
| 5 | 1 | pseudo2 | 0 | pseudo 1 | 0 | titre1| message5| 20h |
| 6 | 2 | pseudo3 | 0 | pseudo 1 | 0 | titre2| message6| 22h |
> j'explique: lorsque quelqu'un envoie un MP, l'ID s'auto incrémente, le CID (conversation ID) qui s'incrémente a chaque nouvelle conversation, exp_lvl et dest_lvl qui sont les niveaux d'affichage (0=non lu; 1=lu; 2=supprimé) le reste est assez clair je crois.
J'ai utilisé pour que les conversations soient sous la forme d'un forum a chaque fois que quelqu'un répond a un message ça garde le même CID et ça l'écrit sur la même page (en order by ID)
Mon problème est:
Je voudrais faire un classement des différentes conversations sur la page principale
j'ai donc utilisé GROUP BY cid pour grouper tous les messages de la même conversation.
seulement le GROUP BY prend le premier CID et donc trie par ordre d'arrivée du premier message de la conversation et non du dernier message.
--> SELECT * FROM mp WHERE (destinataire='$joueur' AND dest_lvl!='2') OR (expediteur='$joueur' AND exp_lvl!='2') GROUP BY cid ORDER BY id DESC"
Resultat obtenu:
(considérant que je suis pseudo1)
+----+------+------------+----------------------+--------+
| cid | titre | auteur | dernier message | posts |
+----+------+------------+----------------------+--------+
| 1 |titre1| pseudo 1 | 20h | 2 |
| 2 |titre2| pseudo 3 | 22h | 3 |
| 3 |titre3| pseudo 4 | 18h | 1 |
Resultat souhaité:
+----+------+------------+----------------------+--------+
| cid | titre | auteur | dernier message | posts |
+----+------+------------+----------------------+--------+
| 2 |titre2| pseudo 3 | 22h | 3 |
| 1 |titre1| pseudo 1 | 20h | 2 |
| 3 |titre3| pseudo 4 | 18h | 1 |
concrètement, j'aimerais savoir: est il possible de grouper en GROUP BY sur le dernier ID et non le premier ou s'il y a un autre moyen que le GROUP BY pour accéder au résultat voulu.
Merci d'avance pour votre aide,
cordialement,
T-Son
J'ai un soucis avec un système de MPs que j'ai mis en place et sur lequel il m'est impossible d'arriver au tri désiré mal-grès les heures passées dessus...
la table est donc
+---+----+--------------+----------+----------------+-----------+-------+-------------+----------+
| id | cid | expediteur | exp_lvl | destinataire | dest_lvl | titre | message | heure |
+---+----+--------------+----------+----------------+-----------+-------+-------------+----------+
| 1 | 1 | pseudo1 | 0 | pseudo 2 | 0 | titre1| message1| 10h |
| 2 | 2 | pseudo3 | 0 | pseudo 1 | 0 | titre2| message2| 13h |
| 3 | 2 | pseudo1 | 0 | pseudo 3 | 0 | titre2| message3| 15h |
| 4 | 3 | pseudo4 | 0 | pseudo 1 | 0 | titre3| message4| 18h |
| 5 | 1 | pseudo2 | 0 | pseudo 1 | 0 | titre1| message5| 20h |
| 6 | 2 | pseudo3 | 0 | pseudo 1 | 0 | titre2| message6| 22h |
> j'explique: lorsque quelqu'un envoie un MP, l'ID s'auto incrémente, le CID (conversation ID) qui s'incrémente a chaque nouvelle conversation, exp_lvl et dest_lvl qui sont les niveaux d'affichage (0=non lu; 1=lu; 2=supprimé) le reste est assez clair je crois.
J'ai utilisé pour que les conversations soient sous la forme d'un forum a chaque fois que quelqu'un répond a un message ça garde le même CID et ça l'écrit sur la même page (en order by ID)
Mon problème est:
Je voudrais faire un classement des différentes conversations sur la page principale
j'ai donc utilisé GROUP BY cid pour grouper tous les messages de la même conversation.
seulement le GROUP BY prend le premier CID et donc trie par ordre d'arrivée du premier message de la conversation et non du dernier message.
--> SELECT * FROM mp WHERE (destinataire='$joueur' AND dest_lvl!='2') OR (expediteur='$joueur' AND exp_lvl!='2') GROUP BY cid ORDER BY id DESC"
Resultat obtenu:
(considérant que je suis pseudo1)
+----+------+------------+----------------------+--------+
| cid | titre | auteur | dernier message | posts |
+----+------+------------+----------------------+--------+
| 1 |titre1| pseudo 1 | 20h | 2 |
| 2 |titre2| pseudo 3 | 22h | 3 |
| 3 |titre3| pseudo 4 | 18h | 1 |
Resultat souhaité:
+----+------+------------+----------------------+--------+
| cid | titre | auteur | dernier message | posts |
+----+------+------------+----------------------+--------+
| 2 |titre2| pseudo 3 | 22h | 3 |
| 1 |titre1| pseudo 1 | 20h | 2 |
| 3 |titre3| pseudo 4 | 18h | 1 |
concrètement, j'aimerais savoir: est il possible de grouper en GROUP BY sur le dernier ID et non le premier ou s'il y a un autre moyen que le GROUP BY pour accéder au résultat voulu.
Merci d'avance pour votre aide,
cordialement,
T-Son
1 réponse
Tu as tronqué les données dans la dernière table ? Je n'ai pas du tout la même chose :
De plus je vois une colonne "auteur" qui n'est pas là au départ. Du coup, je ne comprends pas vraiment ce que tu veux faire dans la mesure où tu as des tables différentes de celle présentée au début du sujet.
MariaDB [test]> select * from t2 where (destinataire='pseudo1' and dest_lvl!=2) or (expediteur='joueur1' and exp_lvl!=2) group by cid order by id desc; +------+------+------------+---------+--------------+----------+--------+----------+-------+ | id | cid | expediteur | exp_lvl | destinataire | dest_lvl | titre | message | heure | +------+------+------------+---------+--------------+----------+--------+----------+-------+ | 5 | 1 | pseudo2 | 0 | pseudo1 | 0 | titre1 | message5 | 20h | | 4 | 3 | pseudo4 | 0 | pseudo1 | 0 | titre3 | message4 | 18h | | 2 | 2 | pseudo3 | 0 | pseudo1 | 0 | titre2 | message2 | 13h | +------+------+------------+---------+--------------+----------+--------+----------+-------+ 3 rows in set (0.00 sec)
De plus je vois une colonne "auteur" qui n'est pas là au départ. Du coup, je ne comprends pas vraiment ce que tu veux faire dans la mesure où tu as des tables différentes de celle présentée au début du sujet.
Si non pour la première table j'ai effectivement regroupé les 5 colonnes de date en une seule:
j'ai en fait; | jour | mois | annee | heure | minute | (que j'ai regroupé en une colonne "heure" du fait que ces 5 colones sont uniquement pour l'affichage)
par contre pour l'affichage que tu arrive a avoir je ne comprends pas trop comment tu arrive a récupérer le dernier du CID 1 et le second du CID 2.
Tu devrais travailler tes requêtes directement sur la base au lieu de tenter de les corriger en passant par PHP : c'est plus simple.