sql >> Database >  >> RDS >> Mysql

MySQL-groep per en bestel per

Een eenvoudige oplossing is om de query in een subselect te stoppen met het ORDER-statement first en het toepassen van de GROUP BY later :

SELECT * FROM ( 
    SELECT `timestamp`, `fromEmail`, `subject`
    FROM `incomingEmails` 
    ORDER BY `timestamp` DESC
) AS tmp_table GROUP BY LOWER(`fromEmail`)

Dit is vergelijkbaar met het gebruik van de join, maar ziet er veel leuker uit.

Het gebruik van niet-geaggregeerde kolommen in een SELECT met een GROUP BY-clausule is niet standaard. MySQL retourneert over het algemeen de waarden van de eerste rij die het vindt en verwijdert de rest. Alle ORDER BY-clausules zijn alleen van toepassing op de geretourneerde kolomwaarde, niet op de verwijderde.

BELANGRIJKE UPDATE Het selecteren van niet-geaggregeerde kolommen werkte in de praktijk, maar er mag niet op worden vertrouwd. Volgens de MySQL-documentatie "dit is vooral handig wanneer alle waarden in elke niet-geaggregeerde kolom die niet in de GROUP BY genoemd wordt hetzelfde zijn voor elke groep. De server is vrij om elke waarde te kiezen van elke groep, dus tenzij ze hetzelfde zijn, zijn de gekozen waarden onbepaald ."

Vanaf 5.7.5 ONLY_FULL_GROUP_BY is standaard ingeschakeld, dus niet-geaggregeerde kolommen veroorzaken queryfouten (ER_WRONG_FIELD_WITH_GROUP)

Zoals @mikep hieronder aangeeft, is de oplossing het gebruik van ANY_VALUE() vanaf 5.7 en hoger

Ziehttp://www.cafewebmaster.com/mysql-order-sort-group https://dev.mysql.com/doc /refman/5.6/en/group-by-handling.html https://dev.mysql.com/doc /refman/5.7/en/group-by-handling.html https://dev.mysql.com /doc/refman/5.7/en/miscellaneous-functions.html#function_any-value



  1. Hoe de decoratie van de resultaatset in Psql-uitvoer te verbergen

  2. Risico bij gebruik van dynamisch geheugen binnen Hyper-V

  3. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:communicatieverbinding mislukt

  4. DAYOFYEAR() Voorbeelden – MySQL