2009-08-14 7 views
0

Je suis en train de développer une vue de calendrier hebdomadaire en lecture seule des événements des utilisateurs. Les colonnes sont les jours de la semaine (mon> soleil) Les lignes sont (intervalles de temps 8:00> 9:00, 9:00> 10:00 ... de 8 heures jusqu'à 19 heures)générer un calendrier hebdomadaire dans mysql/php

Question: Quelle est la meilleure approche pour générer ce calendrier utilisateur:

Option 1: SQL pur Je ne sais même pas si c'est possible, mais je le trouverais suprêmement élégant: avoir mysql générer une table avec 7 colonnes (les jours) et 11 lignes (les intervalles de temps) et ont des sous-requêtes pour chaque intervalle de temps, vérifiant s'il y a une réunion réservée pour ce créneau horaire/utilisateur.

option 2: php/mysql mysql récupère simplement les réunions réservées/utilisateur, et le croise avec un calendrier généré par php.

L'option 1 est-elle possible? Si c'est le cas, cela nécessite-t-il beaucoup de ressources?

Merci, Alexandre

MISE À JOUR: SUGGESTIONS QUERY

Voici la requête "option 2" i utiliser pour obtenir les événements réservés (leçons dans ce cas: l'utilisateur est un enseignant).

SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym 
     FROM timetables 
     INNER JOIN courses ON (courses.id=timetables.course_id) 
     INNER JOIN teachers ON (teachers.id=timetables.prof_id) 
     INNER JOIN locations ON (locations.id=timetables.location_id) 
     WHERE ((timetables.prof_id='$id') 
      AND (timetables.date >= '$starting_date') 
      AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ; 

Je suis très intéressé pour des suggestions sur une requête qui ferait fonctionner l'option 1!

+0

Si vous avez besoin de suggetions pour la requête, ajoutez les tables desc et je (nous) en posterai. –

+0

juste mis à jour la question en conséquence. Je vous remercie. – pixeline

Répondre

2

Essayer de décrire un calendrier comme une table SQL ne semble pas être une bonne correspondance. Il est certainement possible d'effectuer une requête qui générera une table avec 7 colonnes et 11 lignes, mais que feriez-vous avec cette table générée? Vous devrez toujours le rendre en utilisant PHP. Donc commencez avec l'hypothèse que PHP est en train de rendre un calendrier, et éliminez le travail supplémentaire de générer un SQL (et un extrêmement spécifique!) Au préalable. De cette façon, vous pouvez utiliser une seule requête SQL pour récupérer tous les événements qui doivent être visibles en une seule fois, puis les placer sur le calendrier au fur et à mesure que vous les dessinez.

0

J'ai fait quelque chose comme ça, et je pense qu'une table avec 7 colonnes et 11 rangées est une très mauvaise solution - possible mais mauvaise.

Juste une table, où vous stockez tous les "événements", puis le rendre avec php. Votre calendrier est plus flexible (imaginez que vous voulez ajouter plus d'heures de la journée, ou que vous pouvez utiliser des demi-heures, si vous le construisez correctement, ce ne sera que des paramètres de configuration).

Si vous choisissez toujours l'option 1: Je ne pense pas que ce soit très gourmand en ressources, et je pense que vous pourriez être en mesure de mettre en cache ce genre de choses afin qu'il ne soit pas difficile.

+1

Je pense que l'OP ment un ensemble de résultats SELECT QUERY quand il dit que "mysql génère une table". Donc, s'il met un autre timeslots, la requête ajoutera plus de lignes automatiquement. –

+0

en effet. Ma question ne porte pas sur la conception de base de données mais sur une requête select qui retournerait le calendrier hebdomadaire complet avec des intervalles de temps remplis d'événements réservés, un ensemble de résultats de données dans lequel je devrais analyser une simple boucle avec php pour afficher la table html . – pixeline

0

Je pense que vous pourriez faire l'option 1 si vous créez une table avec les intervalles de temps. Cela simplifiera beaucoup les requêtes. Et le code PHP pour générer la page Calendrier sera beaucoup plus simple: vous aurez juste besoin d'itérer sur le jeu de résultats. Et, pour obtenir une bonne performance, vous devez créer un index et une clé appropriés (je ne peux pas en proposer au préalable).

EDIT POUR AJOUTER UNE SUGGESTION: @pixeline: Puisque vous na pas ajouter les mises en page de table, c'est un shoot dans l'obscurité, bu je pense juste changer les INNER JOIN de vous LEFT OUTER JOIN le faire:

SELECT DISTINCT date, hour_from, hour_to, courses.description, courses.alias, teachers.name, locations.new_acronym 
    FROM timetables 
    LEFT OUTER JOIN courses ON (courses.id=timetables.course_id) 
    LEFT OUTER JOIN teachers ON (teachers.id=timetables.prof_id) 
    LEFT OUTER JOIN locations ON (locations.id=timetables.location_id) 
    WHERE ((timetables.prof_id='$id') 
     AND (timetables.date >= '$starting_date') 
     AND (timetables.date < date_add('$starting_date', INTERVAL 7 day))) ; 

Si timetables n'a pas toutes les heures pour la journée, vous pouvez créer une table avec eux (par exemple timeslot) et le mettre comme la première table et mettre les horaires comme LEFT OUTER JOIN ou CROSS JOIN. Et les autres comme LEFT OUTER JOIN comme ci-dessus.

+0

En effet, les événements sont stockés dans une table, et les intervalles de temps dans un autre. J'ai obtenu la requête classique "aller chercher tous les événements de cet utilisateur pour cette semaine" bien. Je trouve que le php de boucler chaque intervalle de temps de la semaine et trouver des correspondances avec ces résultats est assez complexe, c'est pourquoi je pensais qu'une requête mysql pourrait me renvoyer ce calendrier, que php n'aurait qu'à boucler pour rendre la table. – pixeline

Questions connexes