Dėkui už idejas.
Kolkas tikriausiai ir apsistosiu ties Tavo pasiųlytos idejos su paskutinės perskaitytos žinutės data.
Nors ši ideja taip pat turi trukumų - pvz. jeigu "naujų" žinučių po paskutinės perskaitytos būtų daug, tai perskaičius naujausią iš "naujų", tada iškart visos naujos, kurios buvo parašytos anksčiau už paskutinę, taip pat bus automatiškai pažymėtos kaip perskaitytos.

Na bet, kaip jau ir pats įsitikinau, kažką tikrai reikia pasiaukoti, kažko labai tobulo čia kažin ar sugalvosi.;)

štai ką pačiam pavyko primastyti šia tema.

Na, tarkim yra vartotojų (`tbl_users`) ir žinučių (`tbl_posts`) lentelės, jų struktūra nelabai esmė. Perskaitytų žinučių sąrašui, tikriausiai, prireiks dar vienos lentelės - `tbl_viewedposts` su laukais `user_id`, `post_id`.

Toliau. Pvz. jau yra 100 vartotojų sąrašas, ir yra 100 parašytų žinučių. Norint įdiegti minėtą funkciją, reiktų, kad visiems esamems vartotojams visos esamos žinutės jau būtų "perskaitytos". Todėl logiška būtų priimti, kad esant tuščiai `tbl_viewedposts` lentelei, visos žinutės yra "perskaitytos" pas visus vartotojus (šiuo atveju, `tbl_viewedposts` lentelei labiau tiktų vardas `tbl_unviewedposts`).

Tačiau, toks variantas nepatinka tuo, kad norint pridėti naują vartotoją, jam visos žinutės turi būtų "neperskaitytos". O tam reikia lentelėje `tbl_viewedposts` padaryti 100 įrašų (t.y. tiek, kiek yra žinučių). čia gal ir nebūtų bėdos, nes naujam sukurtam vartotojui galima daryti ir taip, kad visos senos žinutės jam būtų "perskaitytos".  Tačiau iš kitos pusės, kūriant naują žinutę, `tbl_viewedposts` taip pat reikia užpildyti tiek kartų, kiek yra vartotojų.


Kitas variantas, jei imti atvirkščiai - jei lentelė `tbl_viewedposts` tusčia, tada visiems vartotojams visos žinutės yra "neperskaitytos"/"naujos". Tačiau šiuo atveju yra panašios problemos. Pvz. norint, kad visiems seniems vartotojams visos senos žinutės būtų "perskatytos" reikia padaryti 100*100 įrašų (100 - vartotojų, 100 - žinučių). Kūriant naują vartotoją, kuriam visos žinutės būtų "perskaitytos", vėl gi reikia daryti tiek įrašų, kiek yra naujienų.


Vienu žodžiu, mano išmastyti variantai man kažkaip nelabai patinka ir atrodo neoptimalūs - po gana dažnai daromų veiksmų, vykdomos ilgos užklausos. Gal visas tas žinutes dar pagal laiką kaip nors žiūrėti, kad pavyzdžiui po 10 dienų visos žinutės pažymiamos kaip "senos" ir "perskaitytos", o jei būtų kokia nors svarbi žinutė, tai ją atitinkamai dar kaip nors pažymėti. Na, nežinau, norėtųsi tiesiog išgirsti šviežių idėjų šia tema, nes jau protas biški užsiciklino. ;)

Gal kas padės, pasiųlys gera idėją kaip realizuoti tokį algoritmą.:)
Na, esme paprasta - turbūt daugelis lankosi forumuose ir susiduręs su tokiu dalyku, kaip "naujos žinutės", kurių dar neperskaitėt. Paspaudžiat tam tikrą mygtuką ir pamatot visas žinutes, kurias dar nesat perskaitę.

Tai va, reiktų panašios funkcijos, kurios optimalaus įgyvendinimo vis dar nesugalvoju, nes atsiranda vis kokių nors negerų niuansų.

Gal ištiesu per nelyg abstrakčiai būtų aiškinti tokiom "grafinėm aibėm" apie duomenų bazes.
Tiesiog čia taip paprastai (gal pernelyg paprastai;]) pabandžiau populistiškai pasinauduoti reliacinė algebra, kurios esmė ir yra tai, kad "kol ryšiai yra aibės, tai ir priemonės tiems ryšiams manipuliuoti gali būti pagrįsti tradiciškomis teoriškomis-aibių operacijomis, papildytomis kai kuriom specialiom, speficiniom duomenų bazių operacijomis" (sorry, bet truputi versta, bet esmė, manau, suprasti galima;]). T.y. čia be tokių tradiciskų veiksmų su aibėm, kaip susikirtymas, apjungimas, skirtumas, sandauga, dar prisideda ir projekcija, prijungimas, dalyba.. ir t.t. ir t.t. čia jau tikrai biški per giliai šaknis knysti reiktų, ko man nelabai ir reikia.;)

Rašant čia apie tai, biški pagooglinau su naujom idėjom, apie tas visokias algebras. Tai radau keletą straipsnių apie tas algebras ir duomenų bazes. Pasirodo tie visi veiksmai "susikirtymas", "sandauga" ir pan, tarsi ir verčiasi kaip "inner/outer/left/right/etc JOIN".:) Jeigu įdomu, tai straipsneliai yra čia:

* http://ru.wikipedia.org/wiki/&#1056 … amp;#1072; (rus) (grynai matematiškai apie rel. algebrą);
* http://en.wikipedia.org/wiki/Relational_algebra (eng) (panašiai, tik su realiais pavyzdžiai su DB lentelėm - kas darosi su lentelių įrašais, jas įvairiai apjungiant; čia jau radau daugmaž tą, ko man ir reikėjo;]);
* http://en.wikipedia.org/wiki/Relational_model (eng) (kaip viskas tai pavirto į reliacinės duomenų bazės).
* http://www.mstu.edu.ru/education/materi … h_4_4.html (rus) (čia galima rasti panašių paveiksliukų, kokius pateikiau ir aš, bet šalia yra pavaizduota ir kas gaunasi su įrašais, atliekant tam tirkas operacijas)


šiaip ar taip lauksiu iš Tavęs pavyzdžiu ir paaiškinimų.;) Pavyzdžių tai radau išties nemažai visokių, kurie lyg ir padėjo susivokti, tačiau vat su vienu iš pirmų pavyzdžiu, kurį prireikė padaryti, jau kilo klausimų. Tai pagrinde ir kreipiausi dėl to, kad padėtumėte suvokti JOIN'us su sau aktualiais pavyzdžiais.:)

Bandau vis aiškiai ir tvirtai įvažiuoti į "JOIN'us". Anksčiau vis kažkaip pavykdavo ir be jų susidoroti, tačiau suvokiu, kad su JOIN'ais galima žymiai suoptimizuoti ir padaryt lankstesnes užklausas.

Tai vat, pirmas dominantis pavyzdžio sprendimas būtų toks - yra dvi lenteles:

* Tekstai (t_id:int, tekstas:text)
* Lankytojai (l_id:int, t_pid:int)

Esmė tokia: kai lankytojas atidaro tekstą yra įrašomas įrašas į `Lankytojai`, kad tas lankytojas yra pamatęs tam tikrą tekstą.
Tai dabar reikia tokio SELECT'o, kad ištraukti tam tikro lankytojo (pagal `Lankytojai`.`l_id`) visus peržiūrėtus ir neperžiūrėtus tekstus (gali būti ir du atskiri SELECT'ai).

Vadovaujantis aibių teorijom, algebriniais veiksmais ir kitais abrikosais reikia išgauti daugmaž tokius poaibius:

Neperžiūrėti tekstai                 Peržiūrėti tekstai
    http://callia.homeip.net/files/poaibiai1.png                      http://callia.homeip.net/files/poaibiai3.png

Iš esmės, peržiūrėtus tekstus pavyko išgauti su tokią užklausa:

SELECT tekstai.*, lankytojai.*
FROM tekstai
LEFT JOIN lankytojai
ON lankytojai.t_id = tekstai.t_id 
WHERE lankytojai.l_id = 5

Neperžiūrėtų tekstų su viena patogia užklausa nelabai pavyksta išgauti.. Neįsivaizduoju dar taip vaizdžiai JOIN'us, todėl kreipiuosi dėl pagalbos.:)

P.S.: Nereikia galvoti kokio nors kito, gal geresnio, sprendimo, tiesiog domina būtent tokio pavyzdžio sprendimas


Tęsiant temą, gal kas taip pat vaizdžiai pateiktų JOIN'ų pavyzdžius kitiems veiksmams su lentelėm.
Gal kam daugiau tai būtų naudinga, gal padės suvokti "JOIN'us";)

Atimtis
http://callia.homeip.net/files/poaibiai1.png

Irgi atimtis?
http://callia.homeip.net/files/poaibiai2.png

Sandauga
http://callia.homeip.net/files/poaibiai3.png

Sudėtis
http://callia.homeip.net/files/poaibiai4.png