Topic: GROUP BY ir ORDER BY madness

Sveiki. Yra lentele

CREATE TABLE `node` (
`nid` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT( 10 ) NOT NULL ,
`created` INT( 10 ) NOT NULL ,
INDEX ( `uid` ) 
);

uid - vartotojo, kuriam priklauso įrašas ID, created - įrašo sukūrimo timestamp'as.

Užduotis: išrinkti įrašus, išrikiuotus pagal created (DESC), kurių uid būtų unikalūs, t.y surasti naujausią kiekvieno vartotojo padarytą įrašą.

Problema: GROUP BY uid vykdomas prieš ORDER BY created, todėl rikiavimas vyksta su jau sugrupuotais duomenimis, o grupavimui paima pirmą pasitaikiusį įrašą su tam tikru uid.

http://www.pythian.com/blogs/374/mysql- … nct-oddity

Kaip suprantu, tas "išrinkti pirmą pasitaikiusį įrašą" yra "featuras". štai ką rašo apie tai: "Generally speaking, query output is non-deterministic — it depends on the full table scan implementation and on the physical order of rows in a table. This means that it’s actually a bug and , instead, MySQL should produce and error on those statements.". Laukiu bet kokių pasiūlymų :)

2 (edited by n0other 2007-02-03 20:52:36)

Re: GROUP BY ir ORDER BY madness

Ok, solved:

SELECT nid, uid FROM node n1 WHERE n1.created = (SELECT MAX(created) FROM node n2 WHERE n1.uid = n2.uid)