Autor Zpráva
Jakuje
Profil
Tak zase otravuju ...

Potřeboval bych kontrolovat přečtenost zpráv a podle toho zobrazit první nepřečtenou.
Zatím mám v MySQL tabulku se zprávami (id,datum,obsah)
a tabulku do které ukládám jaký úživatel si již tuto zprávu přečetl (user_id, mesage_id)

Pomocí JOINu se mi to nějak povedlo udělat, ale když jsem přemýšlel že jich bude víc a mám zobrazit PRVNI nepřečtenou, tak už jsem nevěděl.

Něco podobnéhu musí mít třeba v phpBB, ale v databázi jsem nenašel žádnou logicky pojmenovanou tabulku. Pomůže někdo?
Taps
Profil
Jakuje
zkus to uděla tak že se uživateli kterému došla zpráva ukáže např. prvních 15 znaků zprávu a pak až zprávu rozklikne tak se uloží aktuální čás do databáze ke zprávě která má např id 2. Snad jsem tě navedl správným směrem
Jakuje
Profil
Nějak jsem to nepochopil kam směřuješ ...

Ještě upřesním probleém:
Standartní zprávový systém mám napsaný, ale nyní jsem začal dělat systémové zprávy, které nechodí do složky se zprávami, ale zobrazují se v horní části stránky a uživatel si je může odklepnout, že už ji tam nechce.
djlj
Profil
Ukládej si někam, kteří uživatelé již zprávu viděli, a těm ji už nezobrazuj.

Standartní zprávový systém
K čemu vlajky?
Jakuje
Profil
Ukládej si někam, kteří uživatelé již zprávu viděli, a těm ji už nezobrazuj.
To právě dělám. K tomu mám tu druhou tabulku, ale potřebuju vymyslet jak to z ní dostat ven.

K čemu vlajky?
Vlajkama myslíš zprávy v horní části stránky? Taky se hodí, ať to mají uživatelé na očích
Jakuje
Profil
Ukládej si někam, kteří uživatelé již zprávu viděli, a těm ji už nezobrazuj.
To právě dělám. K tomu mám tu druhou tabulku, ale potřebuju vymyslet jak to z ní dostat ven.

K čemu vlajky?
Vlajkama myslíš zprávy v horní části stránky? Taky se hodí, ať to mají uživatelé na očích
djlj
Profil
Jakuje
Ne, tím myslím ty standarty, o kterých jsi tu začal nějak nesmyslně psát :). Pravděpodobně máš na mysli slovo standard.

potřebuju vymyslet jak to z ní dostat ven
SELECT nefunguje? :)
Joker
Profil
Jakuje
phpBB to má myslím udělané jinak, taky jsem to zkoumal. Tuším, že si ukládá do cookie serializované pole vláken do kterých uživatel vlezl a u každého buď čas nebo ID (teď si nevzpomínám) příspěvku, který byl v tu chvíli poslední.

Nevím, jestli se to v nějakou chvíli přenáší na server, každopádně ten systém je náchylný na smazání cookies.
Jakuje
Profil
SELECT nefunguje? :)
No funguje, ale jak v tom udělat logiku. Nepovedlo se mi v dotazu udělat aby se to pomocí JOIN spojilo s druhou tabulkou a potom (do dotazu) dát podmínku zda je hodnoto z druhé tabulku NULL

Mám tu toto:
SELECT * FROM sysmes LEFT JOIN sysmes_read ON sysmes.id = sysmes_read.mid WHERE (sysmes_read.uid is NULL OR sysmes_read.uid = '" . $user['id'] . "') " . $where . " ORDER BY sysmes.date" . $order_by . " LIMIT 1

a dále v PHP mám podmínku na NULL, ale není to ideální, pokdu je jedna přečtená, další se nevytáhne.
Zrušit limit by bylo asi neefektivní a v else větvi volat další takovou věc ... no nevím

Ne, tím myslím ty standarty, o kterých jsi tu začal nějak nesmyslně psát :). Pravděpodobně máš na mysli slovo standard.
ach ten češtin ...:)
Jakuje
Profil
Asi jsem netrefil přesně předmět/nadpis. Nejde přesně o kontrolu přečtenosti, ale spíš o kontrolu zda zobrazovat uživateli danou zprávu (zruší se kliknutím na odkaz, to už mám vyřešené)
DJ Miky
Profil
K čemu je potřeba druhá tabulka? Nešlo by do první přidat sloupec 'precteno'?
Jakuje
Profil
Jde o to že tato informace je potřeba pro každého uživatele a ne globálně. Můžu to řešit rozesíláním standardních zpráv, ale já jsem to nechtěl kopírovat pro každého.
Alphard
Profil
DJ Miky
otázka je, jestli je jedna zpráva pro jednoho nebo více uživatelů

Jakuje
bylo by vhodné popsat strukturu tabulek a věci, které znáš (id, ...), třeba ti někdo poskládá dotaz, jinak můžeme jenom tipovat řešení a diskutovat s djlj o pravopise (našel si zálibu v opravování chyb)
Jakuje
Profil
... a diskutovat s djlj o pravopise (našel si zálibu v opravování chyb)
Když mu nejde nic jiného :D

bylo by vhodné popsat strukturu tabulek a věci, které znáš (id, ...),
Tabulka sysmes
id - int()
date - int()
content - text
// snad nemusím komentovat

Tabulka sysmes_read
mid - int() - číslo zprávy (sysmes.id)
uid - int() - číslo uživatele, dostupné v každém scriptu projektu

struktura je jednoduchá, ale problém složitý ...

Ještě jednou: Jde mi o to, aby se uživateli s id zobrazila zpráva z tabulky sysmes pokud v tabulce sysmes_read není záznam s id zprávy a id uživatele. Pokud uživatel klikne na odkaz, přidá se do tabulky sysmes_read záznam a dále se zobrazovat nebude, nebo se zobrazí poslední nepřečtená zpráva (ORDER BY date ASC).

Pokud někoho napadne nějaký jiný systém než jsem namyslel já, tak také budu rád. Možná ani není možné to naprogramovat tak jak jsem si to namyslel já.
djlj
Profil
Jakuje
... LEFT JOIN sysmes_read ON users.id=sysmes_read.uid ... WHERE sysmes_read.mid IS NULL

Když mu nejde nic jiného :D
Ono nebylo co psát jiného, když tu nebyla ta struktura…
Jakuje
Profil
... LEFT JOIN sysmes_read ON users.id=sysmes_read.uid ... WHERE sysmes_read.mid IS NULL
Ale já tam potřebuju kotrolovat to ID uživatele. Myslím že databáze to sama nepozná. Toto jsem měl taky, ale prostě to id mi tam chybělo.
djlj
Profil
Ale já tam potřebuju kotrolovat to ID uživatele. Myslím že databáze to sama nepozná.
LEFT JOIN sysmes_read ON users.id=sysmes_read.uid ti nestačí?
Jakuje
Profil
Tak já se blbě zeptám:

user.id je proměnná obashující ID uživatele, kterou tam do toho dotazu vložím?
jestli ano, tak to asi bude fachat. Ráno vyzkouším. Díky
djlj
Profil
Jo, je. Připoj si tam někam i tabulku s uživateli, nebo pokud máš id uživatele už v nějaké proměnné, použij ji.
Jakuje
Profil
OK. Díky. Tak toto mě nějak nedošlo že bych to tak mohl udělat. Přecejenom na vsevjednom jsi asi získal spoustu zkušeností.
Tak jdu spát. Ráno to vyzkouším.
Jakuje
Profil
Tak to mě nenapadlo že se JOINovat pomocí dvou slopců ...
LEFT JOIN sysmes_read ON user.id = sysmes_read.uid AND sysmes.id = sysmes_read.mid

Tak moc díky.

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