Autor Zpráva
kopi
Profil
Dobrý den,
potřeboval bych poradit (na googlu jsem nenašel takový příklad), jak řadit záznamy v rámci GROUP BY? Mám udělané posílání zpráv, jednotlivé zprávy řadím podle odesílatele, ale potřeboval bych, aby se v rámci odesílatele zobrazovala pouze nejnovější zpráva.
Zatím to mám takhle:

$zpravy = MySQL_Query("SELECT * FROM `zpravy` WHERE `prijemce` = '$user_id' GROUP BY odesilatel ORDER BY datum Desc")

Chápu, že takhle mi to řadí podle data pouze skupiny odesílatelů.

Děkuji za radu.
juriad
Profil
Diskuse JPW: Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou Chceš ten třetí dotaz.
kopi
Profil
juriad:
Děkuju. Nějak se mi to nedaří aplikovat. V uvedeném příkladu se používá spojení dvou tabulek. Já to mám v rámci jedné.
Mám tabulku zhruba takto:

zprávy
id
odesilatel
prijemce
zprava
id_zprava
datum

4
62
57
zpráva
4
1449154725

5
62
57
zpráva 2
5
1449154755

7

po výpisu by to měl být jen jeden řádek s náhledem "zpráva 2".
juriad
Profil
V tom dotazu se používá jen jedna tabulka, ale připojuje se vícekrát.

select t1.*
from   zpravy t1,
-- dej mi pro každého odesílatele maximální datum
       (select t2.odesilatel, max(t2.datum) datum
        from   zpravy t2
        group  by t2.odesilatel) t3
-- a vyber ze všech zpráv (pro uživatele) jen ty, které mají takové datumy, které vybral předchozí dotaz
where  t1.odesilatel = t3.odesilatel
       and t1.datum = t3.datum;

Protože sémantika databáze je množinová, může se ti stát, že dotaz vrátí více záznamů, pokud uživatel odeslal více zpráv se stejným datumem (což je předpokládám DATETIME). Pokud bys mohl poznat novější zprávu jinak (třeba pomocí id_zprava), nahradil bys prostě všechny zmínky o datumu v dotazu (za id_zprava).
kopi
Profil
může se ještě zeptat, jak byste udělal výpis? protože tento dotaz mi nefunguje group by, takže to buď není správně a nebo to špatně vypisuju, a protože vy tomu rozumíte víc, tak bude chyba u mého výpis :)

chtěl bych dosáhnou výsledku:

odesilatel 1
úryvek poslední zprávy

odesílatel 2
úryvek poslední zprávy
juriad
Profil
Co znamená, že nefunguje? Když jej spustíš v nějakém adminu, co vypíše? Řazení tam ještě není, sežadit si to můžeš připsáním na konec:
ORDER BY t1.odesilated -- nebo t1.datum
kopi
Profil
vypisuje to zprávy jednotlivě, tzn. dvě zprávy od stejného odesílatele. odesílatel 1 by měl zgrupovat

odesilatel 1
úryvek poslední zprávy

odesílatel 2
úryvek poslední zprávy

odesilatel 1
úryvek poslední zprávy
juriad
Profil
kopi:
A nemají náhodou obě ty zprávy stejný datum?
kopi
Profil
máte můj obdiv!
Děkuju mockrát. Datumy jsem tam přidával manuálně a asi jsem ho jen zkopíroval. Byly opravdu stejné.

Děkuju za pomoc.
kopi
Profil
mohl bych se ještě zeptat, jak u tohodle dotazu udělat, aby se vypisovaly zprávy i opačně? Ukázal si mi tu, jak sloučit zprávy pode odesílatele, ale vypisují se tam zprávy jen, které jsem obdržel od daného uživatele. Dalo by se nějak udělat, aby se vypisovala celá konverzace (tzn. i zprávy ode mě), ale pořád se slučovali jen pod toho jednoho odesílatele?
Tady je dotaz:

 
                  select t1.*
                          from   zpravy t1,
                             (select t2.odesilatel, t2.prijemce, max(t2.datum) datum
                                from   zpravy t2
                                group  by t2.odesilatel) t3
                          where  (t3.prijemce = ".$_SESSION['id']." and t1.odesilatel = t3.odesilatel and t1.datum = t3.datum)
                          or (t3.odesilatel = ".$_SESSION['id']." and t1.prijemce = t3.prijemce and t1.datum = t3.datum) ORDER BY t3.datum Desc;          

takhle to zprávy vypisuje zprávy pro mě i ode mě, ale neslučuje se to jen pod odesílatele :) snad jsem to popsal dobře.
Omlouvám se za ty otázky, ale jsem v těchto pro mě složitějších příkazech nový, tak to chci pochopit a naučit se to.

Děkuju
Kajman
Profil
Pokud mají novější zprávy vyšší id, tak výpis poslední komunikace pro každého z protějšku bude pro uživatel 42 něco jako
SELECT z.*
FROM   zpravy z
JOIN   (SELECT max(maxid) posledni
        FROM   (SELECT odesilatel protejsek, max(id) maxid
                FROM   zpravy
                WHERE  prijemce = 42
                GROUP  BY odesilatel
                UNION ALL
                SELECT prijemce protejsek, max(id) maxid
                FROM   zpravy
                WHERE  odesilatel = 42
                GROUP  BY prijemce) t
        GROUP  BY protejsek) m
ON     z.id = m.posledni
ORDER  BY z.id DESC
kopi
Profil
děkuju, tohle funguje výborně. Sám bych takový dotaz dohromady nedal.
Ještě jednou díky

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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