Autor | Zpráva | ||
---|---|---|---|
TeOkan Profil * |
#1 · Zasláno: 12. 11. 2014, 17:28:55
Zdravím všechny,
mám dotaz: "SELECT messages.* FROM messages JOIN members ON messages.to = members.id AND members.mail = :mail AND members.type = :type WHERE messages.deleted = 0" Tento dotaz mi správně vypisuje všechny zprávy Jde mi o to, abych nevypisoval všechny zprávy, ale zprávu od každého jiného uživatele (tedy jakoby tento dotaz s využitím GROUP BY from (from = column s ID odesílatele)). Tohle pochopitelně není žádný problém: "SELECT messages.* FROM messages JOIN members ON messages.to = members.id AND members.mail = :mail AND members.type = :type WHERE messages.deleted = 0 GROUP BY messages.from" Dále už však bohužel nevím. Jde o to, aby daná zpráva, která se vypíše od každého odesílatele byla právě poslední zpráva - tedy řazení dle datumu. Dotaz který níže přikládám pochopitelně nefunguje, ale vysvětluje o co mi vlastně jde: "SELECT messages.* FROM messages JOIN members ON messages.to = members.id AND members.mail = :mail AND members.type = :type WHERE messages.deleted = 0 ORDER BY messages.date GROUP BY messages.from" Předem děkuji za jakékoliv odpovědi |
||
Kajman Profil |
#2 · Zasláno: 12. 11. 2014, 21:01:40
To bude obdoba 'pro každou kategorii...' z Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení řádků s maximální (minimální) hodnotou
|
||
TeOkan Profil * |
#3 · Zasláno: 13. 11. 2014, 15:35:50
Děkuji za vaší odpověď.
Bohužel se mi však nepodařilo dotaz správně dostat do požadovaného tvaru. (Data se vypisují, ale tak jako výše - nevypíše se právě POSLEDNÍ zpráva.) Moje tabulka: Výpis: Takhle vypadá nyní dotaz: "SELECT t3.* FROM members t1, (SELECT t2.*, max(t2.date) datum FROM messages t2 GROUP BY t2.from) t3 WHERE t3.to = t1.id AND t1.mail = :mail AND t1.type = :type" Mockrát díky |
||
Kajman Profil |
#4 · Zasláno: 13. 11. 2014, 15:54:45
Podle faq by výsledek měl být spíše něco jako
SELECT t1.* FROM messages t1 JOIN (SELECT t2.from, Max(t2.date) datum FROM messages t2 WHERE t2.to = :id_uzivatele GROUP BY t2.from) t3 ON t3.from = t1.from AND t1.to = :id_uzivatele AND t1.date = t3.datum To id_uzivatele si předtím zjistěte podle toho email v tabulce members. |
||
TeOkan Profil * |
#5 · Zasláno: 13. 11. 2014, 16:04:01
Tohle funguje výborně.
Děkuji mockrát, ještě bych rád využil této možnosti a chtěl bych se zeptat: 1) Dle dotazu lze vidět, že pro zjištění uživatele využívám mail a typ uživatele, je tato věc špatně? Není nebezpečné uchovávat v SESSIONU přímo ID uživatele v databázi? práce potom bude samozřejmě příjemnější, ovšem bál jsem se tuto informaci přímo v SESSIONU uchovávat. 2) Pokud by bod 1 vadil a je to opravdu nebezpečné, jak potom dotaz přepsat tak, aby se t1.to rovnal vytaženému id z tabulky members? Ještě jednou strašně moc díky, vážím si toho. |
||
Časová prodleva: 9 let
|
0