8768 sujets

Développement web côté serveur, CMS

Bonjour,

Dans une page je cherche à afficher les détails des sessions auxquelles participe l'utilisateur connecté (nom de la session, organisateur, date, lieu ...).
Toutes les infos sont dans plusieurs tables :
- events (id, name, plannerId, date, duration, town, country, place, numberMin, numberMax),
- eventsParticipants (eventId, participantId),
- users (id, pseudo, ...).

Ma première version marche bien :

$events = $this->db->fetchAll('SELECT events.id, name, plannerId, date, duration, events.town, events.country, place, playersMax FROM events INNER JOIN users ON events.plannerId = users.id WHERE plannerId = ? ORDER BY date ASC', [$id]);

Mais je voudrais pouvoir afficher pour chaque "[x] inscrits / [y] places disponibles".
Je pensais utilsier un COUNT pour avoir le nombre de participants en contant le nombre de participantId dans la table eventsParticipants pour chaque eventId :
COUNT(participantId) as numberParticipants GROUP BY eventId


Avec donc comme requête :

$events = $this->db->fetchAll('SELECT events.id, name, plannerId, date, duration, events.town, events.country, place, playersMax, participantId, COUNT(participantId) as numberPlayers GROUP BY eventId FROM events INNER JOIN users ON events.plannerId = users.id INNER JOIN eventsParticipants ON events.id = eventsParticipants.eventId WHERE plannerId = ? ORDER BY date ASC', [$id]);


Mais j'obtiens un message d'erreur :
SyntaxErrorException

An exception occurred while executing 'SELECT events.id, name, plannerId, date, duration, events.town, events.country, place, playersMax, participantId, COUNT(participantId) as numberPlayers GROUP BY eventId FROM events INNER JOIN users ON events.plannerId = users.id INNER JOIN eventsParticipants ON events.id = eventsParticipants.eventId WHERE plannerId = ? ORDER BY date ASC' with params ["1"]:

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY eventId FROM events INNER JOIN users ON events.plannerId = users.id INN' at line 1


S'agit-il d'une erreur de raisonnement sur le COUNT ou d'une erreur de synthaxe de la requête ?

Merci d'avance.
Modifié par AlexP (22 Dec 2017 - 16:54)
Hello Smiley smile

erreur dans la requète Smiley smile
le group by doit être avant le order by et après le where Smiley smile

y a des règles de syntaxe Smiley smile si tu les respecte pas forcément ça aide pas Smiley cligne
Bien sur du coup tu devra aliaser eventId sur la bonne table Smiley cligne

Et joyeux noël Smiley lol
Meilleure solution
pchlj a écrit :
du coup tu devra aliaser eventId sur la bonne table


C'est à dire que je dois faire
COUNT(participantId) as numberParticipants FROM eventsParticipants

Parce que "participantId" est une colonne de la table eventsParticipants ?

J'avais essayé avec GROUP BY entre WHERE et ORDER BY mais ça n'avait pas réglé mon problème.

Merci pour la réponse.
Re Smiley cligne
Ta requête devrait ressembler à quelque chose comme ça ou approchant je sais pas dans quelle table exactement sont les colonnes

SELECT events.id, name, plannerId, date, duration, events.town, events.country, place, playersMax, participantId, COUNT(participantId) as numberPlayers FROM events INNER JOIN users ON events.plannerId = users.id INNER JOIN eventsParticipants ON events.id = eventsParticipants.eventId WHERE plannerId = ? GROUP BY eventsParticipants.eventId ORDER BY date ASC
J'avais pas vu la réponse plus tôt.

En effet, c'est la requête que j'utilise désormais et j'obtiens le résultat que je voulais.