Afficher une liste par jour de semaine

Résolu/Fermé
amateurDebutant Messages postés 4 Date d'inscription mardi 11 février 2014 Statut Membre Dernière intervention 18 mars 2014 - Modifié par amateurDebutant le 11/02/2014 à 18:08
Jean_Mafatte Messages postés 1 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 21 février 2014 - 21 févr. 2014 à 22:38
Bonjour à tous,
Je tente de chercher une solution à un problème de requête en vue d'afficher une liste avec php/mysql.
J'ai une table composée de jours de la semaine. Chaque jour contient une liste d'adhérents en activité.
Je voudrais afficher la liste des adhérents pour chaque jour de la semaine, mais comme vous le voyez dans le code de requête ci-dessous mon affichage contient des cellules vides que je voudrais supprimer.
J'ai vainement essayé avec des jointures, mais je m'y perds.
<code>SELECT DISTINCT lundi, mardi, mercredi, jeudi, vendredi  FROM adherentsSemaine;
</code>
+----------+----------+----------+---------+----------+
| lundi    | mardi    | mercredi | jeudi   | vendredi |
+----------+----------+----------+---------+----------+
| Max      |          |          |         | Max      |
|          |          | Pierre   |         |          |
|          |          |          | Nico    |          |
| Kitty    |          |          |         |          |
| Remi     | Remi     | Remi     |         |          |
|          |          | Fatima   |         |          |
|          | Fred     |          |         |          |
| vero     |          | vero     |         | vero     |
| vero     | vero     |          |         |          |
| Angelic  | Angelic  |          |         |          |
| Nico     |          | Nico     |         | Nico     |
|          | Nico     |          |         |          |
+----------+----------+----------+---------+----------+

Avec GROUP BY ce n'est pas mieux, ni avec IS NOT NULL
Merci pour vos idées et coups de pouce

A voir également:

4 réponses

lewis34 Messages postés 2557 Date d'inscription samedi 21 juillet 2007 Statut Membre Dernière intervention 30 mai 2015 352
11 févr. 2014 à 17:49
bonjour, ta travaille avec quoi ? php/mysql, sql ou autre ?
0
Salut,

Indiquer la structure de vos tables. Vous faites des recherches sur les champs des tables et non sur les résultats il me semble.
Les gens peuvent s'appeler Pierre, Paul, Jacques, Vero... la requête doit concrnner le champ 'Nom'.
Idem pour les jours d la semaine, ce n'est pas lundi, mardi...etc qu importe c'est de distinguer pour chaque jour de la semaine qui importe(quel qu'il soit).


Ici vous trouverez des cours et des exemples de requêtes. Mais si vos tables ne sont pas bonne cela ne servira à rien:vous ne devez pas avoir des tables qui se nomment Pierre ou Lundi mais des champs de table qui correspondent au prénom dans une table et au jour dans l'autre.

Les tables sont des entités qui regroupent des données sur un thème.
Vous devez donc avoir une table personne correspondant au nom et informations de la personne et une table correspondant aux jours(éventuellement horaires de la semaine). En croisant les 2 tables vous obtiendrez un résultat cohérent.
Sinon vous faites une erreur car vous n'avez aucun moyen de discerner de façon unique les lignes de la table; elle est fausse et toutes les autres informations s'en trouvent faussées.


" ci-dessous mon affichage contient des cellules vides que je voudrais supprimer. "
Le principe des tables c'est qu'elles ont des colonnes correspondant au champs et des lignes correspondant à des jeux de valeurs ou de données.
Pour qu'il n'y ait pas de vide dans la table il faut lors de la création de vos table mettre une contrainte forte qui correspondrait à : Tout les jours de la semaine et toutes les heures de chaque jour doivent avoir un adhérent.
Ce qui n'est de façon crédible absolument pas possible. Il suffit du désistement d'une personne et c'est foutu pour la table, une ligne est fausse et toute la base de donnée l'est.

Pour un calendrier vous pouvez avoir(avec les spécificités de votre système d'information)
https://www.commentcamarche.net/contents/655-merise-initiation-a-la-conception-de-systemes-d-information

Je fait une ébauche:
0
(les noms de table commencent par un "t", la valeur identifiant unique est suivie de ID, l'indication FK correspond à une clé étrangère, une valeur récupérée d'une autre table pour croiser les données et obtenir vos résultats)


[tCalendrier]
date (complète: heure/jour/mois/année) ID*
adhérent FK(qui correspond au numéro adhérent sur la table tAdhérent)
activité
présence

[tAdhérent]
numéro_adhérent ID**
Nom
Prénom





* éventuellement utiliser le format de données timestamp unix qui est une date en nombre de secondes donc facilement manipulable et indivisible, sinon les 4 valeurs sont identifiantes, utiliser un format DATETIME.

**numéro adhérent permet d'éviter d'utiliser Nom et Prénom comme identifiant. Le problème n'est pas qu'ils sont 2 champs différent (on peut avoir 2 champs identifiants) mai que si 2 personne s'appellent du même nom et prénom(homonyme) on ne pourra pas les différencier(base et programme finissent à la poubelle), c'est rare 2 personne du même nom et prénom mais ça peut arriver, donc autant le prévoir.

Pour vos requêtes vous pouvez faire ceci:
Afficher toutes les personnes qui sont présent un jour donné:

SELECT Nom, Prénom FROM tAdhérent , tCalendrier WHERE DATE date='indiquer une date' AND adhérent.tCalendrier = numéro_adhérent.tAdhérent

Cela s'appelle une jointure de table et même si c'est un peu compliqué à comprendre au début c'est la seule façon de procéder correctement.
0
amateurDebutant Messages postés 4 Date d'inscription mardi 11 février 2014 Statut Membre Dernière intervention 18 mars 2014
12 févr. 2014 à 01:56
Bonjour Rajo et merci pour vos réponses.
J'ai seulement voulu schématiser mes explications sans compliquer les choses avec l'intéraction d'un calendrier.
Cette table temporaire est un résultat qui fait appel à une table 'adhérents' et une table 'activités' qui sont construites comme vous précisez si justement. Les adhérents sont identifiés avec un DATETIME et et les activités utilisent un calendrier indexé sur le lundi comme début de chaque semaine 'W'. Tout cela fonctionne pour afficher activités/adhérents ou adhérents/horaires.
La requête que vous m'avez donné produit le même affichage avec des cellules vides si l'adhérent n'est pas présent tous les jours. Puisque chaque ligne de ma table 'activité' ou 'présence' comprend l'horaire, le jour, la semaine pour un adhérent et son identifiant. La lecture SQL se fait ligne par ligne je crois.
J'ai aussi tenté un deuxième essai avec des tables temporaires pour chaque jour de semaine qui affichent bien la liste voulue pour chaque jour. Mais lorsque je fais une fusion de ces tables, comme c'est expliqué dans le topic : https://forums.commentcamarche.net/forum/affich-5026964-faire-fusionner-2-tables-pour-recuperer je me retrouve avec des redondances de listes et des décalages contenant des cellules vides.
voici un aperçu des tables temporaires:
--
-- Structure de la table adherentsParJourSemaine
--
CREATE TABLE IF NOT EXISTS 'adherentsSemaine' (
  'id' int(3) NOT NULL AUTO_INCREMENT,
  'lundi' varchar(40) DEFAULT NULL,
  'mardi' varchar(40) DEFAULT NULL,
  'mercredi' varchar(40) DEFAULT NULL,
  'jeudi' varchar(40) DEFAULT NULL,
  'vendredi' varchar(40) DEFAULT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

--
-- Structure de la table d'un jourSemaine
--
CREATE TABLE IF NOT EXISTS 'SemLu' (
  'id' SMALLINT(3) NOT NULL AUTO_INCREMENT,
  'lun' varchar(40) DEFAULT NULL,
  PRIMARY KEY ('id')
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;

0
Jean_Mafatte Messages postés 1 Date d'inscription vendredi 21 février 2014 Statut Membre Dernière intervention 21 février 2014
Modifié par Jean_Mafatte le 21/02/2014 à 22:41
À question d'à propos réponse d'à propos même si c'est un peu tard. Il n'y a pas lieu ici de faire appel à du MERISE ou à une quelconque méthode de modélisation pour traiter ce pb précis. je suis pour ma part plutôt partisan de l'UML pour ce qui est modélisation, mais ce n'est pas là le problème. Je penses que "amateurDebutant" demande comment pouvoir présenter des listes ne dépendant d'aucune liaison d'ID ou autre puisque SQL lit ligne par ligne et du coup laisse des cellules vides là où il n'y a pas d'enregistrement correspondant dans la ligne lue.
Le problème a été résolu apparemment, mais je donne ma solution pour servir à qui recherche.
SELECT GROUP_CONCAT(lundi  SEPARATOR '  ') AS lundi ,  GROUP_CONCAT(mardi  SEPARATOR '  ')  AS mardi  ,  GROUP_CONCAT(mercredi  SEPARATOR '  ')  AS mercredi  , GROUP_CONCAT(jeudi  SEPARATOR '  ')  AS jeudi,  GROUP_CONCAT(vendredi  SEPARATOR '  ')  AS vendredi
FROM adherentsSemaine

De cete manière les colonnes présentent des listes sans trous vides dans les colonnes, sans recours à de la modélisation et sans se soucier de compatibilité inter tables, qui ne sont d'aucun secours pour ce cas précis. Éventuellement voir du côté CSS l'affichage du résultat. Voilou.
0