Topic: GROUP by ir ORDER by

Tikslas yra išdėstyti naujausias nuotraukas, mažėjančia tvarka pagal naujumą, bet kad nesikartotų tie patys dalyviai.

Tarkime, Jonas ir Petras atsiuntė po 10 nuotraukų, bet sąraše "Naujos foto" turi matytis tik dvi foto - naujausia Jono foto ir naujausia Petro foto. Ta, foto, kuri buvo atsiusta veliau (tai yra, kurios id didesnis) turi buti pirma.

ši užklausa veikia gerai:

select max(id) maxid, kieno from foto where statusas='0' or statusas='2' group by kieno order by maxid desc limit 50

Tačiau man reikia duomenų ir iš dalyvio lentelės, todėl aš mėginu taip:

select dalyviai.id, dalyviai.vardas, dalyviai.gimdata, max(foto.id) maxid, foto.failas from dalyviai, foto where dalyviai.id=foto.kieno and (foto.statusas='0' or foto.statusas='2') group by foto.kieno order by maxid desc limit 50

Bet antrosios užklausos rezultatai jau nesutampa su pirmosios. Lengviausias sprendimas būtų ciklo viduje rašyti antrą užklausą, kuri paimtų dalyvio duomenis. Bet norisi visa tai padaryti vienoje užklausoje. Ką darau ne taip? Dėkoju už atsakymą.

Re: GROUP by ir ORDER by

Tai su pirma užklausa pasiimk tik naujausių foto `id`, tada gautą rezultatą JOIN'ink su `foto` lentele (iš čia pasiimsi `kieno` ir `failas`) ir visą gautą rezultatą JOIN'ink su `dalyviai` lentele, iš kur pasiimsi dalyvių informaciją.

Kažkaip taip turi gautis:

SELECT foto.id,
   foto.kieno,
   foto.failas,
   dalyviai.id,
   dalyviai.vardas,
   dalyviai.gimdata
FROM foto
   INNER JOIN (
      SELECT max(id) id
      FROM foto
      WHERE statusas='0'
         OR statusas='2'
      GROUP BY kieno
      ORDER BY maxid DESC
      LIMIT 50
   ) naujausios ON foto.id = naujausios.id
   INNER JOIN dalyviai ON foto.kieno = dalyviai.id

Re: GROUP by ir ORDER by

Puikiai veikia, didelis dėkui. O kodėl mano variantas neveikė? Tubut dar nelabai gerai suprantu, kaip veikia tas group by ir order by.

Galvoju taip: group by sudaro grupes su vienodom tam tikro laukelio reikšmėm, o order by surikiuoja duomenis tose grupėse pagal kažkokią dar kitą laukelio reikšmę.

Mano užklausoje turejo vykti taip: sudaromos grupės pagal foto.kieno. Ir iš kiekvienos tos grupės imamas didžiausias grupės foto.id. O rezultatai surašomi pagal va šitaip atrinktų įrašų foto.id mažėjančia tvarka (desc).

Bet kodėl pagal šitą principą nesuveikė mano antra užklausa? O gal aš klystu ir viskas vyksta visai ne taip?

Re: GROUP by ir ORDER by

Arvydas wrote:

Galvoju taip: group by sudaro grupes su vienodom tam tikro laukelio reikšmėm, o order by surikiuoja duomenis tose grupėse pagal kažkokią dar kitą laukelio reikšmę.

ORDER BY rūšiuoja tik galutinį rezultatą.

Tuo tarpu viskas veikia taip:

GROUP BY - grupuoja elementus pagal nurodytą (-us) stulpelius. Kokius duomenis pateikti stulpelio, pagal kurį grupuojame, rezultatuose viskas aišku - nes toje grupėje to stulpelio reikšmės visur vienodos. Tuo tarpu padėtis su likusiais stulpeliais dažnai lieka neaiški. čia reikia žinoti, kad palikus rezultatų paėmimą serveriui likusiems stulpeliams tai serveris pateiks rezultatus kaip jam patinka - pagal kažkokį tais vidinį algoritmą, kuri mes išoriškai galime vadinti RANDOM (-; Norint suvaldyti iš grupės skirtingų reikšmių gaunamus rezultatus galima naudoti agregatines funkcijas (tokias aip MAX(), MIN(), AVG(), CONCAT(), GROUP_CONCAT() ir pan.). Jų pagalba galima iš tos grupės išrinkti vieną reikšmę ir ją turėti rezultatuose.

Taigi apibendrinus tu suklydai, manydamas, kad ORDER BY rūšiuoja reikšmes grupėse. ORDER BY iš tikro rūšiuoja galutinius rezultatus prieš pateikiant juos klientui.