« 1 2
Autor Zpráva
Kajman
Profil
tečky:
proto by mě zajímalo jak vyřešit ten příklad uvedený na začátku

Ten je přece vyřešený. Poslední dotaz vypadá použitelně, ale jen do řádku 36. Jen před limitem na řádku 33 chybí řazení.

A odešle 11 zpráv ... 10 zpráv je maximum viditelné na jedné stránce příjemce B si přečte těch 10 zpráv na té jedné stránce a odpoví

Ale od jedné osoby jste přeci chtěl zobrazit jen jeden jediný řádek. Takové chování se tu nikdy neřešilo. Pokud chcete evidovat, co četl, evidujte si, které zprávy si zobrazil. Když mu je zobrazíte a on neodpoví, tak je přeci četl, ale nemáte to uložené. To by šlo např. příznakem v novém sloupci v té tabulce vzkazů.
tečky
Profil *
Kajman:
Popíšu to tedy celé. Mám sice už řešení s tím že jsem vytvořil novou tabulku, kde už řeším jenom doručenky, ale určitě by mě zajímal správný návrh struktury tabulek. Čili systém má fungovat tak, že je stránka komunikací... na té stránce se uživatelovi zobrazuje 20 posledních komunikací které vedl (ať už je zahájil nebo někdo psal jemu) seřazených od nejaktuálnější po nejstarší. mezi tím si může rolovat ještě dolů na starší komunikace. Pokud se v některé z těhto komunukací nachází něco co ještě nečetl, tak to má u každé té komunikace uvedeno. Aby to nebylo snadné tak jsem vymyslel že to nechci jako je to třeba na facebooku že když někomu odešlete zprávu a on si jí přečte, tak se to dozvíte. Tady se o tom dozvědět nemáte a proto v tom dotazu i zjišťuji kdo je adresátem abych mohl rozlišit koho informovat o tom že nějaká zpráva je nepřečtená.

Pokud chcete evidovat, co četl, evidujte si, které zprávy si zobrazil.

To přesně dělám. špatně jsem to vysvětlil... problém je v tom, že ty doručenky které se zobrazjí, se zobrazují pro nejnovější ID vzkazu... když si uživatel komunikaci rozklikne, tak se mu updatují ty které vidí, (podle ideček) protože tam je taky další rolovátko jenom na zprávy. (Uf snad to píšu pochopitelně) Jenomže on tu jedenáctou už nevidí... musel by zarolovat rolovátkem, ale to z nějakého důvodu neudělá...takže uživatel se v tuhle chvíli rozhodne že odpoví na těch prvních 10... to udělá a v tu chvíli už se podle toho idikátoru doručenek v komunikacích nedozví že jedenáctou má nepřečtenou. :DDD toť jsou celé mé trable.

A problém je tedy vlastně to že ten dotaz musí pak ještě prohledat všechny ty komunikace a hledat v nich nepřečtené doručenky. Strašně se bojim tý zátěžovosti proto jsem to nakonec rozdělil na další tabulku kde se počítá kolik existuje doručenek mezi lidma co s spolu komunikujou. Nicméně ta nejistota... nevim jestli je to správně. Je to každopdáně už funkční.
Kajman
Profil
Počet nepřečtených zpráv si vypočíteje jen pro ty zobrazené záznamy (limit 20) kolerovaným dotazem - tam rozlišujte zda se to přihlášenému uživateli doručovalo nebo to odeslal. Něco jako



SELECT x.*,
       u.nick,
       (SELECT Count(*)
        FROM   vzkazy_data v
        WHERE  v.id_odesilatel = x.provazane_id
               AND v.id_adresat = 42
               AND v.dorucenka = 0) AS neprectenych
FROM   (SELECT DISTINCT ON (provazane_id) t.*
        FROM   ((SELECT DISTINCT ON (id_adresat)
                        vd.*,
                        id_adresat AS provazane_id
                 FROM   vzkazy_data vd
                 WHERE  id_odesilatel = 42
                 ORDER  BY id_adresat,
                           cas_zpravy DESC)
                UNION ALL
                (SELECT DISTINCT ON (id_odesilatel)
                        vd.*,
                        id_odesilatel AS provazane_id
                 FROM   vzkazy_data vd
                 WHERE  id_adresat = 42
                 ORDER  BY id_odesilatel,
                           cas_zpravy DESC)) t
        ORDER  BY provazane_id,
                  cas_zpravy DESC) x
       JOIN uzivatele u
         ON x.provazane_id = u.id
ORDER  BY cas_zpravy DESC
LIMIT  20 OFFSET 0
tečky
Profil *
jo... zajímavý jak je to jinej úhel pohledu ... nicméně tohle má stejnej problém jako všechny moje dotazy co jsem předtim zkoušel.

Uživatel A odešle 11 zpráv.
Uživatel B si otevře komunikaci a tím se mu zobrazí 10 zpráv. Těch 10 se aktualizuje, ale jedenáctá ne protože tu zatim nevidí musel by posunout stránku. (to je zatim vpořádku)
Ale... teď uživatel B neposune z nějakého důvodu stránku ale místo toho hned odpoví uživatelovi A ... a v tom okamžiku nastane problém. Teď ten dotaz už platí pro tu poslední zprávu... takže uživatel B se už nikdy nedoví že má nepřečtenou jedenáctou zprávu pokud nezaroluje...

ten dotaz jsem si upravil pro svoje účely... takhle :

                    SELECT
                         provazane_id,
                         uzivatelska.nick_uzivatele,
                         adresat,
                         (SELECT Count(*)
                         FROM vzkazy_data v
                         WHERE v.id_odesilatel_vzkazy_data = x.provazane_id
                              AND v.id_adresat_vzkazy_data = ".$_SESSION['id_uzivatele']."
                              AND v.dorucenka_vzkazy_data = true) AS pocet_neprectenych
                    FROM (SELECT DISTINCT ON (provazane_id) t.*
                         FROM ((SELECT DISTINCT ON (id_adresat_vzkazy_data)
                                   cas_zpravy_vzkazy_data,
                                   id_adresat_vzkazy_data AS adresat,
                                   id_adresat_vzkazy_data AS provazane_id
                              FROM vzkazy_data AS vd
                              WHERE id_odesilatel_vzkazy_data = ".$_SESSION['id_uzivatele']."
                              ORDER BY id_adresat_vzkazy_data,
                                   cas_zpravy_vzkazy_data DESC)
                         UNION ALL (
                              SELECT DISTINCT ON (id_odesilatel_vzkazy_data)
                                   cas_zpravy_vzkazy_data,
                                   id_adresat_vzkazy_data AS adresat,
                                   id_odesilatel_vzkazy_data AS provazane_id
                              FROM vzkazy_data AS vd
                              WHERE id_adresat_vzkazy_data = ".$_SESSION['id_uzivatele']."
                              ORDER BY id_odesilatel_vzkazy_data,
                                   cas_zpravy_vzkazy_data DESC)) AS t
                         ORDER BY provazane_id,
                              cas_zpravy_vzkazy_data DESC) x
                         JOIN uzivatele AS uzivatelska
                              ON x.provazane_id = uzivatelska.id_uzivatele
                    ORDER BY cas_zpravy_vzkazy_data DESC
                    LIMIT 20 OFFSET ".$cislo_stranky_komunikatoru



Ne vlastně ne :D moje chyba... ten dotaz funguje správně vlastně... já jsem to jenom špatně napasoval do php.
« 1 2

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:

0