2011-04-28 3 views
3

J'ai commencé sur un script pour générer des statistiques de la fréquence et quand un article particulier est appelé en utilisantGROUP_CONCAT avec groupement supplémentaire?

SELECT `title`, `page_id`, COUNT(*) AS `total`, 
GROUP_CONCAT(DISTINCT `date_created` 
      ORDER BY `date_created` SEPARATOR ',') dates 
FROM `statistics` 
WHERE `supplier_id` = '27' 
GROUP BY `title` 
ORDER BY `title`; 

qui produit

[0] => Array 
     (
      [0] => Array 
       (
        [total] => 3 
        [dates] => 2011-04-26,2011-04-27 
       ) 

      [statistics] => Array 
       (
        [title] => Title 2 
        [page_id] => 2 
       ) 
     ) 

[1] => Array 
     (
      [0] => Array 
       (
        [total] => 6 
        [dates] => 2011-04-26,2011-04-27,2011-04-28 
       ) 

      [statistics] => Array 
       (
        [title] => Title 7 
        [page_id] => 7 
       ) 
     ) 

Good stuff. Mais comment puis-je ajouter un domaine similaire à des dates qui ajoute une répartition des ids groupées par date_created créant ainsi quelque chose comme:

[2] => Array 
    (
     [0] => Array 
      (
       [total] => 6 
       [dates] => 2011-04-26,2011-04-27,2011-04-28 
       [total_by_date] => 2,1,3 
      ) 

     [statistics] => Array 
      (
       [title] => Title 7 
       [page_id] => 7 
      ) 
) 

Je voudrais ajouter un groupe supplémentaire en le long de ces lignes:

GROUP_CONCAT(DISTINCT COUNT(*) AS `total_by_date` 
      GROUP BY `date_created` ORDER BY `date_created` SEPARATOR ',') 

mais ça ne marche pas, comment résoudre ce problème?

DÉCHARGE:

CREATE TABLE `statistics` (
    `id` int(11) NOT NULL auto_increment, 
    `pagetype` varchar(50) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `supplier_id` int(11) NOT NULL, 
    `page_id` int(11) default NULL, 
    `title` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL, 
    `date_created` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=920 ; 

-- 
-- Dumping data for table `statistics` 
-- 

INSERT INTO `statistics` (`id`, `pagetype`, `supplier_id`, `page_id`, `title`, `date_created`) VALUES 
(1, 'newsarticle', 27, 2751, 'Title 1', '2011-04-26'), 
(2, 'newsarticle', 27, 2751, 'Title 1', '2011-04-26'), 
(3, 'newsarticle', 27, 2751, 'Title 1', '2011-04-27'), 
(4, 'newsarticle', 27, 462009, 'Title 2', '2011-04-26'), 
(5, 'newsarticle', 27, 462009, 'Title 2', '2011-04-26'), 
(6, 'newsarticle', 27, 462009, 'Title 2', '2011-04-27'), 
(7, 'newsarticle', 27, 462009, 'Title 2', '2011-04-27'), 
(8, 'newsarticle', 27, 462009, 'Title 2', '2011-04-27'), 
(9, 'newsarticle', 27, 462009, 'Title 2', '2011-04-28'), 
(10, 'newsarticle', 27, 46200, 'Title 3', '2011-04-26'), 
(11, 'newsarticle', 27, 46200, 'Title 3', '2011-04-26'), 
(12, 'newsarticle', 27, 46200, 'Title 3', '2011-04-26'), 
(13, 'newsarticle', 27, 46200, 'Title 3', '2011-04-26'), 
(14, 'newsarticle', 27, 46200, 'Title 3', '2011-04-26'); 
+0

Pourriez-vous mettre à jour votre question en affichant un petit vidage avec create et quelques instructions insert? –

+0

Question mise à jour - a ajouté un vidage. Cheers, Taff – Taff

Répondre

1

pas 100% sûr que ça va marcher, mais il est un début:

Faites la 2ème GROUP_CONCAT dans une sous-requête.

SELECT title 
    , s1.page_id 
    , s2.total_by_date 
    , GROUP_CONCAT(DISTINCT s1.date_created 
       ORDER BY s1.date_created SEPARATOR ',') as dates 
FROM statistics s1 
INNER JOIN 
    (SELECT page_id 
    ,GROUP_CONCAT(/*DISTINCT*/ gc.cnt 
    ORDER BY gc.date_created SEPARATOR ',') AS total_by_date 
    FROM 
    (
     SELECT count(*) as cnt 
     ,date_created 
     FROM statistics 
     WHERE supplier_id = '27' 
     GROUP BY date_created 
    ) gc 
    GROUP BY gc.date_created 
) s2 ON (s1.page_id = s2.page_id)  
WHERE supplier_id = '27' 
GROUP BY title 
ORDER BY title; 

des numérations distincts (*) cacherait éléments avec le même chef d'accusation, ce qui est je pense que vous voulez, alors je l'ai mis en forme commentée.
BTW le ORDER BY title n'est pas nécessaire ici, car GROUP BY trie déjà sur le titre.

+0

Merci pour la réponse Johan. Malheureusement, il ne semble pas aimer le COUNT (*) dans GROUP_CONCAT. Y a-t-il un moyen de contourner cela? Je reçois un 1111: Utilisation invalide de l'erreur de fonction de groupe. – Taff

+0

@taff, mis à jour la réponse, espérons que cela aide. – Johan

+0

Toujours obtenir une erreur "1111: utilisation invalide de la fonction de groupe". Étrange comme je suis sûr que j'ai utilisé COUNT avec GROUP_CONCAT dans le passé ... quoique une requête plus facile ;-) – Taff