Autor | Zpráva | ||
---|---|---|---|
kopi Profil |
#1 · Zasláno: 5. 12. 2015, 14:24:10
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 |
#2 · Zasláno: 5. 12. 2015, 14:25:50
|
||
kopi Profil |
#3 · Zasláno: 5. 12. 2015, 14:48:29
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 |
#5 · Zasláno: 5. 12. 2015, 17:37:45
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 |
#6 · Zasláno: 5. 12. 2015, 17:45:05
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 |
#7 · Zasláno: 5. 12. 2015, 17:55:45
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 |
#8 · Zasláno: 5. 12. 2015, 17:59:32
kopi:
A nemají náhodou obě ty zprávy stejný datum? |
||
kopi Profil |
#9 · Zasláno: 5. 12. 2015, 18:05:20
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 |
#10 · Zasláno: 7. 12. 2015, 22:37:52
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 |
#12 · Zasláno: 8. 12. 2015, 09:36:23
děkuju, tohle funguje výborně. Sám bych takový dotaz dohromady nedal.
Ještě jednou díky |
||
Časová prodleva: 9 let
|
0