Autor Zpráva
TeOkan
Profil *
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
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 *
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
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 *
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.

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: