ORDER BY date and time BEFORE GROUP BY name in mysql

后端 未结 10 514
星月不相逢
星月不相逢 2020-12-01 06:20

i have a table like this:

name    date         time
tom | 2011-07-04 | 01:09:52
tom | 2011-07-04 | 01:09:52
mad | 2011-07-04 | 02:10:53
mad | 2009-06-03 | 00         


        
相关标签:
10条回答
  • 2020-12-01 06:23

    This is not the exact answer, but this might be helpful for the people looking to solve some problem with the approach of ordering row before group by in mysql.

    I came to this thread, when I wanted to find the latest row(which is order by date desc but get the only one result for a particular column type, which is group by column name).

    One other approach to solve such problem is to make use of aggregation.

    So, we can let the query run as usual, which sorted asc and introduce new field as max(doc) as latest_doc, which will give the latest date, with grouped by the same column.

    Suppose, you want to find the data of a particular column now and max aggregation cannot be done. In general, to finding the data of a particular column, you can make use of GROUP_CONCAT aggregator, with some unique separator which can't be present in that column, like GROUP_CONCAT(string SEPARATOR ' ') as new_column, and while you're accessing it, you can split/explode the new_column field.

    Again, this might not sound to everyone. I did it, and liked it as well because I had written few functions and I couldn't run subqueries. I am working on codeigniter framework for php.

    Not sure of the complexity as well, may be someone can put some light on that.

    Regards :)

    0 讨论(0)
  • 2020-12-01 06:26

    I think this is what you are seeking :

    SELECT name, min(date)
    FROM myTable
    GROUP BY name
    ORDER BY min(date)
    

    For the time, you have to make a mysql date via STR_TO_DATE :

    STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s')
    

    So :

    SELECT name, min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
    FROM myTable
    GROUP BY name
    ORDER BY min(STR_TO_DATE(date + ' ' + time, '%Y-%m-%d %h:%i:%s'))
    
    0 讨论(0)
  • 2020-12-01 06:28

    Another way to solve this would be with a LEFT JOIN, which could be more efficient. I'll first start with an example that considers only the date field, as probably it is more common to store date + time in one datetime column, and I also want to keep the query simple so it's easier to understand.

    So, with this particular example, if you want to show the oldest record based on the date column, and assuming that your table name is called people you can use the following query:

    SELECT p.* FROM people p
    LEFT JOIN people p2 ON p.name = p2.name AND p.date > p2.date
    WHERE p2.date is NULL
    GROUP BY p.name
    

    What the LEFT JOIN does, is when the p.date column is at its minimum value, there will be no p2.date with a smaller value on the left join and therefore the corresponding p2.date will be NULL. So, by adding WHERE p2.date is NULL, we make sure to show only the records with the oldest date.

    And similarly, if you want to show the newest record instead, you can just change the comparison operator in the LEFT JOIN:

    SELECT p.* FROM people p
    LEFT JOIN people p2 ON p.name = p2.name AND p.date < p2.date
    WHERE p2.date is NULL
    GROUP BY p.name
    

    Now, for this particular example where date+time are separate columns, you would need to add them in some way if you want to query based on the datetime of two columns combined, for example:

    SELECT p.* FROM people p
    LEFT JOIN people p2 ON p.name = p2.name AND p.date + INTERVAL TIME_TO_SEC(p.time) SECOND > p2.date + INTERVAL TIME_TO_SEC(p2.time) SECOND
    WHERE p2.date is NULL
    GROUP BY p.name
    

    You can read more about this (and also see some other ways to accomplish this) on the The Rows Holding the Group-wise Maximum of a Certain Column page.

    0 讨论(0)
  • 2020-12-01 06:32

    work for me mysql select * from (SELECT number,max(date_added) as datea FROM sms_chat group by number) as sup order by datea desc

    0 讨论(0)
  • 2020-12-01 06:37

    Use a subselect:

    select name, date, time
    from mytable main
    where date + time = (select min(date + time) from mytable where name = main.mytable)
    order by date + time;
    
    0 讨论(0)
  • 2020-12-01 06:43

    I had a different variation on this question where I only had a single DATETIME field and needed a limit after a group by or distinct after sorting descending based on the datetime field, but this is what helped me:

    select distinct (column) from
    (select column from database.table
    order by date_column DESC) as hist limit 10
    

    In this instance with the split fields, if you can sort on a concat, then you might be able to get away with something like:

    select name,date,time from
    (select name from table order by concat(date,' ',time) ASC)
    as sorted
    

    Then if you wanted to limit you would simply add your limit statement to the end:

    select name,date,time from
    (select name from table order by concat(date,' ',time) ASC)
    as sorted limit 10
    
    0 讨论(0)
提交回复
热议问题