Autor Zpráva
martin1312
Profil
Zdravím,

neviem si rady s týmto:
mám tabuľku messages a potrebujem vypísať posledné prijaté správy určitého užívateľa ale tak, aby sa radili ako "konverzacie" a zobrazila sa v tom výpise iba posledná správa.

štruktúra tabuľky:


a toto chcem dosiahnúť:


V podstate čiastočne funguje tento dotaz SELECT * FROM `messages` WHERE `user_id_to` = 5 GROUP BY `user_id_from` ORDER BY `date_created` DESC, ale ten vypíše prvú správu v každej konverzácií, ja potrebujem poslednú.

Viete ako na to?

Ďakujem
DJ Miky
Profil
Můžeš se inspirovat příkladem ze zdejších FAQ - Nalezení řádků s maximální (minimální) hodnotou, konkrétně ten třetí dotaz. Jen místo maximální ceny budeš hledat nejvyšší datum zprávy.
martin1312
Profil
DJ Miky:
Tomu som sa chcel presne vyhnúť, ak to ide nejako jednoduchšie :) Ale ďakujem za reakciu.
DJ Miky
Profil
Jednodušeji to jde v případě, že by ti stačilo např. jen datum poslední zprávy, ale ne její text. Při GROUP BY totiž můžeš využít agregační funkce a pro datum poslední zprávy by to tedy bylo:
SELECT *, MAX(date_created) datum_posledni_zpravy FROM ... GROUP BY user_id_from ...
Ale text už tímto způsobem nevytáhneš, proto potřebuješ dva dotazy, jeden (vnořený) na vytažení ID posledních zpráv a druhý na vytažení doplňkových dat o každé zprávě z prvního dotazu.
martin1312
Profil
Aha, jasne. No ja potrebujem aj ten text, takže použijem ten príklad z FAQ, ďakujem za vysvetlenie.


DJ Miky:
mohol by si ma trochu nakopnúť? Tie vnorene dotazy mi akosi nejdú

SELECT a.* 
FROM `messages` a,
     (SELECT b.id, b.date_created 
      FROM `messages` b GROUP BY b.user_id_from 
      ORDER BY b.date_created DESC) c
WHERE a.user_id_to = 5 AND a.id = c.id AND a.date_created = c.date_created

vráti to isté, čo som uviedol hore - teda tie prve zaznamy, nie posledne


tak sa mi to podarilo, ak by niekto potreboval vedieť ako:
select a.*
from   messages a,
       (select b.user_id_from, max(b.date_created) date_created
        from   messages b
        group  by b.user_id_from)  c
where  a.user_id_from= c.user_id_from
       and a.date_created= c.date_created
       and a.user_id_to = 5

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: