On 07/12/2009 07:16 PM, Martin Radosta wrote:
> 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;
>
>


Sorry, did'nt read your problem in detail, try this query:

|SELECT MONTH , min( num_downloads ) AS num_downloads, min( num_logins ) 
AS num_logins
FROM (
SELECT MONTHNAME( created ) AS
MONTH , COUNT( 1 ) AS num_downloads, NULL AS num_logins
FROM downloads
GROUP BY MONTH
UNION
SELECT MONTHNAME( created ) AS
MONTH , NULL AS num_downloads, COUNT( 1 ) AS num_logins
FROM logins
GROUP BY MONTH
) AS q
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 [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to