On 07/11/2009 02:06 PM, brian wrote:
> I have a StatsController with which I'd like to make a summary of all
> logins and all downloads for each month.
>
> class Login extends AppModel
> {
>       public $belongsTo = array('User');
>       public $hasMany = array('Download');
> }
>
> class Download extends AppModel
> {
>       public $belongsTo = array(
>               'ItemFile', 'User', 'Login'
>       );
> }
>
> I can easily create separate queries but would need to merge them. i
> haven't been able to figure that part out.
>
> public function admin_summary()
> {
>       $logins = $this->Login->find(
>               'all',
>               array(
>                       'fields' =>  array(
>                               'MONTHNAME(created) AS month',
>                               'COUNT(*) AS num_logins'
>                       ),
>                       'recursive' =>  -1,
>                       'group' =>  array('month')
>               )
>       );
>       $downloads = $this->Download->find(
>               'all',
>               array(
>                       'fields' =>  array(
>                               'MONTHNAME(created) AS month',
>                               'COUNT(*) AS num_downloads'
>                       ),
>                       'recursive' =>  -1,
>                       'group' =>  array('month')
>               )
>       );
>       // ...
> }
>
> This gives me:
>
> Array
> (
>       [0] =>  Array
>       (
>               [Login] =>  Array
>               (
>                       [month] =>  July
>                       [num_logins] =>  16
>               )
>       )
>       [1] =>  Array
>       (
>               [Login] =>  Array
>               (
>                       [month] =>  June
>                       [num_logins] =>  168
>               )
>       )
>       [2] =>  Array
>       (
>               [Login] =>  Array
>               (
>                       [month] =>  May
>                       [num_logins] =>  64
>               )
>       )
> )
>
>
> app/controllers/stats_controller.php (line 171)
>
> Array
> (
>       [0] =>  Array
>       (
>               [Download] =>  Array
>               (
>                       [month] =>  July
>                       [num_downloads] =>  11
>               )
>       )
>       [1] =>  Array
>       (
>               [Download] =>  Array
>               (
>                       [month] =>  June
>                       [num_downloads] =>  367
>               )
>       )
>       [2] =>  Array
>       (
>               [Download] =>  Array
>               (
>                       [month] =>  May
>                       [num_downloads] =>  15
>               )
>       )
> )
>
> What I'm after is something like:
>
> Array
> (
>       [0] =>  Array
>       (
>               'July' =>  array(
>                       'Download' =>  Array
>                       (
>                               'num_downloads' =>  11
>                       ),
>                       'Login' =>  Array
>                       (
>                               'num_logins' =>  16
>                       )
>               )
>       )
>       ...
> )
>
> or even ...
>
> Array
> (
>       [0] =>  Array
>       (
>               'July' =>  array(
>                       'Download' =>  11,
>                       'Login' =>  16
>               )
>       )
>       ...
> )
>
>
> Incidentally, I've been tryng to figure out a way to do this in a
> single query (MySQL) but I get strange results:
>
> mysql>  SELECT MONTHNAME(created) AS month, COUNT(*) AS num_logins FROM
> logins GROUP BY month;
> +-------+------------+
> | month | num_logins |
> +-------+------------+
> | July  |         15 |
> | June  |        168 |
> | May   |         64 |
> +-------+------------+
> 3 rows in set (0.00 sec)
>
> mysql>  SELECT MONTHNAME(created) AS month, COUNT(*) AS num_downloads
> FROM downloads GROUP BY month;
> +-------+---------------+
> | month | num_downloads |
> +-------+---------------+
> | July  |            11 |
> | June  |           367 |
> | May   |            15 |
> +-------+---------------+
> 3 rows in set (0.00 sec)
>
> mysql>  SELECT MONTHNAME(l.created) AS month, COUNT(l.id) AS
> num_logins, COUNT(d.id) AS num_downloads FROM logins AS l LEFT JOIN
> downloads AS d ON d.login_id = l.id GROUP BY month;
> +-------+------------+---------------+
> | month | num_logins | num_downloads |
> +-------+------------+---------------+
> | July  |         20 |            11 |
> | June  |        477 |           367 |
> | May   |         71 |            15 |
> +-------+------------+---------------+
> 3 rows in set (0.23 sec)
>
> I figure it's because month is related to logins, not downloads.
> However, it seems odd that it's the login numbers that are wonky, not
> downloads. If anyone can think of a way to do this in one query I'd
> really appreciate it.
>
> >
>    
Try this and let me know if it works:

SELECT MONTHNAME(l.created) AS month, COUNT(l.id) AS
num_logins, COUNT(d.id) AS num_downloads FROM logins AS l INNER JOIN
downloads AS d ON d.login_id = l.id GROUP BY month;



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to 
cake-php+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to