2013-01-29 6 views
0

J'ai une table nommée 'tasks' qui contient un tas d'informations (à qui elle est affectée, date de création, date d'échéance, etc.)Tirer les entrées en fonction d'un champ datetime et organiser par mois et par année

Le champ 'task_due_date' est un champ datetime normal. Je voudrais organiser toutes les tâches par ceci; par exemple, si vous avez eu 3 tâches en mars 2013 et 4 en avril, je veux les séparer en divs pour chaque mois afin qu'elles puissent être repliées pour faciliter la lecture.

Je me demandais quelle est la meilleure façon de procéder? Comment puis-je le rendre à l'épreuve du futur? Je sais que je pourrais écrire manuellement des boucles PHP pour chaque année (si le mois est 1, faites-le, si le mois est 2, faites ceci, etc.) mais il semble qu'il y ait un moyen beaucoup plus efficace.

Il doit être au courant des années, donc Janvier 2013 devrait avoir son baisse par rapport à Janvier 2014.

Ma solution de rêve serait:

  • Mars 2013: Tâche 1, Tâche 2
  • Avril 2013: Tâche 1
  • mai 2013: Tâche 1, Tâche 2

Voici le SQL pour mes tâches ta BLE:

CREATE TABLE IF NOT EXISTS `tasks` (
`ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
`task_status` int(11) unsigned NOT NULL DEFAULT '1', 
`task_creation_date` datetime NOT NULL, 
`task_due_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
`task_completed_date` datetime DEFAULT NULL, 
`task_priority` bigint(20) unsigned NOT NULL, 
`task_assignment` int(11) unsigned NOT NULL, 
`task_description` longtext NOT NULL, 
`task_type` bigint(20) unsigned NOT NULL DEFAULT '0', 
PRIMARY KEY (`ID`), 
KEY `task_type` (`task_type`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2698 ; 

Répondre

1

S'il y aura beaucoup de tâches, vous pourriez envisager de générer le divs 'mensuels' et récupération des tâches réelles via une charge AJAX.

Vous pouvez afficher le nombre de tâches par année/mois en les regroupant avec une requête;

SELECT 
    COUNT(*) AS number_of_tasks, 
    YEAR(task_due_date) AS task_year, 
    MONTH(task_due_date) AS task_month 
FROM tasks 
GROUP BY task_year, task_month; 

Avec cela, créez les divs, puis récupérer (via AJAX) toutes les tâches dans l'année sélectionnée/mois avec cette requête

SELECT * 
FROM tasks 
    WHERE YEAR(task_due_date) = 2013, 
    AND MONTH(task_due_date) = 1 
+0

Cela a fonctionné parfaitement pour moi. Merci beaucoup. – ihateartists

+0

De rien. Bonne chance pour votre projet – thaJeztah

0

Cela vous donnera votre, près de votre « rêve solution ", bien que j'aie pu prendre cela un peu trop littéral:

SELECT 
    CONCAT(
    DATE_FORMAT(`task_due_date`, '%M %Y'), 
    ': ', 
    GROUP_CONCAT(CONCAT('Task ', `ID`) SEPARATOR ', ') 
) AS `tasks_per_month` 
FROM 
    `tasks` 
GROUP BY 
    DATE_FORMAT(`task_due_date`, '%M %Y') 
ORDER BY 
    `task_due_date`; 
Questions connexes