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]