Autor | Zpráva | ||
---|---|---|---|
Kajman Profil |
#1 · Zasláno: 1. 7. 2014, 21:56:17
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 * |
#2 · Zasláno: 2. 7. 2014, 18:57:15
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 |
#3 · Zasláno: 3. 7. 2014, 22:43:34
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 |
||
Časová prodleva: 1 měsíc
|
|||
tečky Profil * |
#4 · Zasláno: 3. 8. 2014, 00:40:00 · Upravil/a: tečky
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. |
||
Časová prodleva: 10 let
|
0