2010-05-29 5 views
1

J'ai construit un joli système de calendrier shnazzy, mais il y a un réglage que je dois faire pour que je sois complètement content.Créer des enregistrements en double sur SELECT pour la plage de dates du calendrier

Mon calendrier a trois tables:

calevents - L'événement calandré. Caldates - Les occurrences et la plage de dates de chaque occurrence pour chaque événement.

calcats - Les catégories qui peuvent être appliquées à un événement.

Les courts:

Pour chaque calevent, il peut y avoir beaucoup de caldates, une pour chaque occurrence de calevent. Ainsi, un calevent qui se répète toutes les semaines et couvre 3 jours pourrait avoir caldates comme ceci:

date_id date_eid date_start date_end 
2   37   2010-06-21 2010-06-23 
3   37   2010-06-28 2010-06-30 
7   37   2010-07-05 2010-07-07 
9   37   2010-07-12 2010-07-14 

Ce que je veux faire, est lors de la sélection de tous les caldates pour un mois déterminé, comme 2010-06, pour revenir non seulement la deux enregistrements ci-dessus, mais à la place un enregistrement pour chaque date dans la plage de date_start et date_end pour chaque caldate.

Donc, si je cherchais 2010-06, je recevrais:

date_id date_eid date_start date_end  date_day 
2   37   2010-06-21 2010-06-23 2010-06-21 
2   37   2010-06-21 2010-06-23 2010-06-22 
2   37   2010-06-21 2010-06-23 2010-06-23 
3   37   2010-06-28 2010-06-30 2010-06-28 
3   37   2010-06-28 2010-06-30 2010-06-29 
3   37   2010-06-28 2010-06-30 2010-06-30 

Le Long:

La raison pour laquelle je veux ce faire, est donc lors de l'affichage d'une liste d'événements (calevents) pour un mois spécifié, une occurrence (caldates) de cet événement sera affichée pour CHAQUE des jours qu'il couvre.

Je pourrais le faire avec PHP en bouclant chaque jour du mois en cours et en affichant une copie de chaque caldate si le jour du mois se situe entre date_start et date_end. Mais le faire de cette façon m'empêchera d'utiliser la pagination d'enregistrement si nécessaire.

Par exemple, si pour un mois déterminé ont été retournés les caldates suivants:

date_id date_eid date_start date_end 
2   37   2010-06-21 2010-06-27 
94  53   2010-06-09 2010-07-08 

Faire record aurait pagination voir cela comme seulement deux enregistrements (« lignes »). Mais boucler à travers eux avec PHP générerait 29 "rangées".

Donc, je me dis que si j'utilise mysql pour créer chaque ligne au lieu de PHP, je peux réaliser la même chose ET être toujours capable d'utiliser la pagination si un mois a beaucoup d'événements/dates.

En ce qui concerne les performances, je ne sais pas quelle option est la plus efficace. Les deux enverraient la même quantité d'informations au navigateur, c'est donc seulement le travail requis pour générer l'info qui compte.

Ma requête en cours qui va chercher toutes les occurrences d'un mois donné, et de rendre les choses un peu plus compliquées ... les rejoint avec leur événement et la catégorie, ressemble à ceci:

$sql_to_execute = " 
SELECT 
    date_id, 
    date_eid, 
    date_start, 
    date_end, 
    event_id, 
    event_title, 
    event_category, 
    event_private, 
    event_location, 
    SUBSTRING_INDEX(event_detailsstripped, ' ', 40) AS event_detailsstripped, 
    event_time, 
    event_starttime, 
    event_endtime, 
    event_active, 
    cat_colour 
FROM 
    (
    caldates 
LEFT JOIN 
    calevents 
ON 
    caldates.date_eid = calevents.event_id 
) 
LEFT JOIN 
    calcats 
ON 
    calevents.event_category = calcats.cat_id 
WHERE 
    date_start <= '".mysql_real_escape_string($dbi_list_end_date)."' 
    AND date_end >= '".mysql_real_escape_string($dbi_list_start_date)."' 
    ".$dbi_category." 
ORDER BY 
    date_start ASC 
"; 

Toute aide ou un conseil serait grandement apprécié!

Merci,

Peter

Répondre

2

La chose la plus facile à faire ce que vous voulez serait:

  • Generate a table of ALL dates (within a reasonable range)

  • Inscrivez-vous caldates table all_dates table:

    SELECT * FROM caldates, all_dates 
    WHERE all_dates.date BETWEEN "2010-06-01" AND "2010-06-30" 
    AND all_dates.date BETWEEN caldates.date_start AND caldates.date_end 
    

    Ajouter une jointure à calevents que vous le souhaitez

+0

Je dois créer la table des dates de façon permanente correcte? ... Pas une table temporaire ou quelque chose comme ça, non? Que diriez-vous est "raisonnable"? 10 années valent bien sûr 3650 records. Je ne pense pas que ce serait trop mauvais hein? Avec le fonctionnement de mon calendrier, je pourrais probablement descendre jusqu'à moins de mille, mais disons 3650 pour être en sécurité. Merci pour l'aide jusqu'à présent! – peterallcdn

+0

Oui à tous. La table permanente est plus efficace. 10 ans semble raisonnable mais bien sûr, seulement quelqu'un qui connaît le domaine du problème (vous) peut donner un verdict final à ce sujet. Mais vous pouvez toujours avoir votre requête d'API externe la plus grande date connue et développer cette table si nécessaire – DVK

+0

Okay great! Je vais prendre cette route. C'est probablement plus rapide qu'une boucle php, ou une autre requête mysql plus complexe. Merci DVK. – peterallcdn

Questions connexes