Autor Zpráva
Lukáš66666
Profil *
Čau, potřeboval bych poradit se sestavením dotazu do MySQL.

Máme takový jednoduchý chat kde si můžou vždy psát 2 uživatelé mezi sebou a chtěli bychom si tam doplnit přehled otevřených konverzací, ale nevíme jak od každé konverzace vypsat vždy jenom tu poslední zprávu mezi těmi uživateli.

Př.:
Pavel si bude psát s uživateli Lukáš, Tomáš a Jitka takže by po přihlášení měl vidět ten seznam kde bude

Lukáš (20:00): poslední zpráva této konverzace
Tomáš (19:00): poslední zpráva této konverzace
Jitka (13:00): poslední zpráva této konverzace 

Neví někdo jak na to?

Struktura tabulky se zprávami je:

id
uid_m
datum
odesilatel
prijemce
zprava
Keeehi
Profil
Diskuse JPW: Některé časteji řešené dotazy pro MySQL - FAQ » Nalezení posledních pěti článků z každé kategorie

Ale myslím, že by měl stačit i ten dotaz nad tím.
Kajman
Profil
Spíše to bude něco takového
Diskuse JPW: řazení záznamů uvnitř GROUP BY
Lukáš66666
Profil
Tak jsem nakonec zkopíroval toto řešení a zdá se že to funguje v pohodě. Ale absolutně ten dotaz nechápu, tak snad bude fungovat bez chyb.

SELECT z.*
FROM   tabulkasezpravami z
JOIN   (SELECT max(maxid) posledni
        FROM   (SELECT odesilatel protejsek, max(id) maxid
                FROM   tabulkasezpravami
                WHERE  prijemce = ".$uzivatel."
                GROUP  BY odesilatel
                UNION ALL
                SELECT prijemce protejsek, max(id) maxid
                FROM   tabulkasezpravami
                WHERE  odesilatel = ".$uzivatel."
                GROUP  BY prijemce) t
        GROUP  BY protejsek) m
ON     z.id = m.posledni
ORDER  BY z.id DESC
Lukáš66666
Profil
Nedokázal by mi někdo laicky vysvětlit co vlastně to join apod dělá? Koukal jsem se na několik návodů, ale vůbec to nechapu.
Keeehi
Profil
SELECT odesilatel protejsek, max(id) maxid
FROM   tabulkasezpravami
WHERE  prijemce = ".$uzivatel."
GROUP  BY odesilatel
UNION ALL
SELECT prijemce protejsek, max(id) maxid
FROM   tabulkasezpravami
WHERE  odesilatel = ".$uzivatel."
GROUP  BY prijemce
Vytáhne IDčka posledních zpráv od různých uživatelů přijatých uživatelem a k tomu jsou přidaná IDčka posledních zpráv různým uživatelům odeslaných uživatelem.

SELECT max(maxid) posledni
FROM   (**předchozí výsledek**) t
GROUP  BY protejsek
Jedna konverzace se ve výpisu objrví typicky 2x jednou zpráva poslaná uživateli, podruhé odeslaná uživatelem. Dotaz tedy vybere tu novější z nich. Dostaneme tedy idčka zpráv, které se mají už finálně zobrazit.

SELECT z.*
FROM   tabulkasezpravami z
JOIN   (**předchozí výsledek**) m
ON     z.id = m.posledni
ORDER  BY z.id DESC
Tady se zprávy už jen filtrují a to pomocí JOINu.

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: