[MySQL] Grupowanie i sortowanie wyników

Swego czasu miałem spory problem z rozwiązaniem problemu wyciągnięcia danych grupując i sortując jednocześnie.

Cały problem polegał na tym, że chciałem wyciągnąć najnowszego newsa z konkretnej grupy. Robiłem to mniej więcej tak:

SELECT
*
FROM
news
GROUP BY group_id
ORDER BY date_publication DESC

Niestety wynik bywał opłakany, bo wyciągane były zazwyczaj newsy pierwsze z brzegu. Dlaczego? Otóż przed ORDERem następuje grupowanie. MySQL w tej sytuacji nie patrzy na to czy ma jakoś posortować dane, tylko najpierw grupuje, a potem coś tam próbuje posortować :)

Żeby rozwiązać ten palący problem spędziłem trochę czasu na poszukiwaniach w Sieci. Widziałem jakieś INNER JOINy z JOINami i innymi cudami. Rozwiązanie, które pokażę (a znalazłem przypadkiem :)) wykorzystuje podzapytanie. Całość wydaje się zgrabna i czytelna, chociaż przyznam, że nie sprawdzałem pod kątem wydajności.

SELECT
*
FROM
(
SELECT * FROM news ORDER BY date_publication DESC
)
GROUP BY group_id
Ten wpis umieszczono w kategorii MySQL, Programowanie. Możesz dodać go do zakładek permalink. Dodaj komentarz lub dodaj odpowiedź (trackback): Trackback URL.

6 Komentarze

  1. Opublikowano 3 July, 2009 at 09:48 | Permalink

    A zobacz, co Ci pokaże EXPLAIN po pierwszym, a co po drugim zapytaniu. [;

  2. andrzej wawrzyniak
    Opublikowano 22 September, 2009 at 01:13 | Permalink

    pod wzgledem wydajnosci to napewno nie jest dobrze

  3. Opublikowano 25 September, 2009 at 02:27 | Permalink

    Fajnie ale mi wywala błąd
    MySQL zwrócił komunikat: Dokumentacja
    #1064 – Something is wrong in your syntax obok ‘SELECT * FROM forum_post ORDER BY id_post DESC) GROPU BY id LIMI’ w linii 1
    Ktoś pomoże?? najlepiej proszę o kontakt na Email

  4. Opublikowano 25 September, 2009 at 02:28 | Permalink

    Mma takie zapytanie SELECT * FROM (SELECT * FROM forum_post ORDER BY id_post DESC) GROPU BY id

  5. cudny
    Opublikowano 5 December, 2009 at 12:12 | Permalink

    A jak wlepić podzapytanie dla takiego czegoś – bo nic mi nie działa:
    select distinct(id), sum(ilosc) from zamowienia group by id
    Ja to po prostu posortowałem w php zapisując do tablic wielowymiarowych poprzez multisort();
    Nie ma chyba innego rozwiązania.
    Pzdr

  6. Albhert
    Opublikowano 8 April, 2010 at 08:22 | Permalink

    SELECT *
    FROM news
    WHERE date_publication = ALL(SELECT MAX(date_publication) FROM news GROUP BY group_id)

Skomentuj

Twój adres email nie zostanie opublikowany i nie będzie rozpowszechniany. Wymagane pola są oznaczone *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>