Thank you for the answer! However, it doesn't seem to solve my problem. Running the 
query 
without modifications repeated users (because of the "group by user, HOST"). I removed 
the 
HOST, and ran the query over again. Now it returned unique users, but it still didn't 
return 
the LAST login of them many logins for each user. 

Currently I am using a new implementation with two queries and PHP in between. I won't 
write all the code here, just explain the basics.

1. A query gets the total number of logins for each user
2. PHP retrieves the logins and "orders" them with a perfect hash
      - I create an array with indexes correspondig to usernames
      - the values in the array are the numbers of logins corresponding to each 
username
      - this way I have practically no overhead when accessing the array
              for example: $users['a_username'] = 10;  /* 10 logins by user a_username 
*/
3. Another query gets all logins ordered by the time column, last first
4. PHP reads the results. When a user is found that has more than 0 logins in the 
$users 
array, I print the user and the amount of logins, and set the value in the $users 
array to 0. 
This guarantees only printing a user once, and only printing the last login due to 
ordering by 
the time field. 

But this also has obvious drawbacks as to performance. I may have to retrieve 10.000 
rows 
from the userlog table to get 10 unique users, or I might never have 10 unique users 
in the 
table, even with 1.000.000.000 records! I just never know. I also have to make two 
queries, 
which gives a small overhead. Finally, using scripting to interprete intermediate 
results is 
much slower than MySQL. All in all, this just doesn't seem to be a very scaleable 
solution.



Remi Mikalsen

E-Mail: [EMAIL PROTECTED]
URL:    http://www.iMikalsen.com



On 4 Oct 2004 at 9:14, [EMAIL PROTECTED] wrote:

> What you are looking for is the MAX() of the Time column (most recent 
> entry)
> 
> select user, host, max(time) as time, count(user) as visits
> from userlog where user!=''
> group by user, host
> order by time desc 
> limit 10;
> 
> The issue you ran into is caused by an non-standard SQL extension created 
> by MySQL.  Its behavior is documented here:
> 
> http://dev.mysql.com/doc/mysql/en/GROUP-BY-hidden-fields.html
> 
> <SOAPBOX ON>
> IMHO, this extension of the SQL spec has caused more problems than it has 
> helped. I believe a better extension would have been to add a new GROUP BY 
> predicate like FIRST() or LAST() so that the behavior would be explicit 
> and controllable. It is even documented that the value returned is 
> potentially random
> 
> "Do not use this feature if the columns you omit from the GROUP BY part 
> are not unique in the group! You will get unpredictable results."
> 
> I know it's too late to take this behavior out of the older versions of 
> MySQL but is there any way to prevent its inclusion in future versions? 
> Are there other options out there to "fix" this non-deterministic 
> behavior? I do not believe that educating the community to _avoid_ a 
> feature is a viable option.  If it were, I do not think that we would need 
> to explain this strange behavior to new users as often as we do.
> <SOAPBOX OFF>
> 
> Shawn Green
> Database Administrator
> Unimin Corporation - Spruce Pine
> 
> 
> "Remi Mikalsen" <[EMAIL PROTECTED]> wrote on 10/01/2004 06:41:32 PM:
> 
> > Hello.
> > 
> > I'm having a problem where I seem to need to order a table before 
> > applying group by (or 
> > distinct?) in my query.
> > 
> > Here is a simplified table structure example:
> > ID  USER  HOST  TIME
> > 
> > ID = Primary Key
> > 
> > I would like to do the following in ONE query, if possible:
> > I am looking to retrieve the LAST time 10 UNIQUE users were 
> > registered in the table 
> > (user+host+time). These users should be the last 10 people to be 
> > inserted into the table 
> > (each user can appear various times in the table, like in a log). At
> > the same time, I would like 
> > to retrieve the TOTAL NUMBER of times each of these users appear in 
> > the table, but this is 
> > not very important.
> > 
> > This was the query I adopted until noticing it had a severe problem:
> > 
> > select user, host, time, count(user) as times 
> > from userlog where user!=''
> > group by user 
> > order by time desc 
> > limit 10;
> > 
> > The problem is that the TIME associated with each person isn't the 
> > LAST TIME a registry 
> > was done for the user. This makes me think that I might need to 
> > order the TIME column 
> > before doing the GROUP BY, but I do no know how (and it might not 
> > even be the solution to 
> > the problem!).
> > 
> > I do not know if I managed to express myself very well, but if 
> > anyone is willing to help, I 
> > would of course clarify things if necessary.
> > 
> > 
> > Remi Mikalsen
> > 
> > E-Mail:   [EMAIL PROTECTED]
> > URL:   http://www.iMikalsen.com
> > 
> > 
> > -- 
> > MySQL General Mailing List
> > For list archives: http://lists.mysql.com/mysql
> > To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
> > 
> >


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to