Autor Zpráva
pavel z
Profil
Ahoj, v mysql potřebuju spojit tabulku se články s tabulkou komentářů, spočítat je a spojit s tabulkou komentare_read (read je v past participle), kde je ke každému článku a uživateli uložen timestamp posledního shlédnutého komentáře, a to celé spojit se stejnou tabulkou "komentáře", která má v podmínce dříve vybraný timestamp posledního shlédnutého komentáře.

clanky: | id_clanek | nazev | ... |
komentare: | id_komentar | id_clanek | timestamp | ... |
komentare_read: | id_clanek | stamp_read |


SELECT cl.id_clanek, cl.nazev, kread.stamp_read
-- ,count(k.id_clanek) AS koment_pocet -- radek A
,count(knew.id_clanek) AS koment_nove -- radek B
FROM clanky cl
-- LEFT JOIN komentare k USING(id_clanek) -- radek A

LEFT JOIN komentare_read kread
ON kread.id_clanek = cl.id_clanek
AND kread.clovek = 'pavel'

LEFT JOIN komentare knew -- radek B
ON knew.id_clanek = cl.id_clanek -- radek B
AND knew.timestamp > kread.stamp_read -- radek B

GROUP BY cl.id_clanek


Problém tkví asi v tom, že k tabulce 'clanky' připojuji dvakrát stenou tabulku 'komentare', ikdyž má jinou podmínku. Při zakomentování řádků A totiž korektně funguje zobrazení nových a při zakomentování řádků B zase zobrazení všech. K řešení by možná mohly vést čísla, která se vypíší při odkomentování všech řádků.

Snad zná někdo řešení tohoto problému z hlavy, ale jestli ne, tak jsem pro vás (a než jsem propadl beznaději i pro sebe) napsal simulační zjednodušený skript, který můžete odladit.

http://www.gjk.wjake.com/upload/dva-joiny-na-jednu-tbl.php.txt
Kajman_
Profil *
S tou tabulkou komentare to stačí spojit přeci jen jednou.

SELECT cl.id_clanek, cl.nazev, kread.stamp_read
,count(k.id_clanek) AS koment_pocet
,ifnull(sum(k.timestamp > kread.stamp_read),0) AS koment_nove
FROM clanky cl
LEFT JOIN komentare_read kread
ON kread.id_clanek = cl.id_clanek
AND kread.clovek = 'pavel'
LEFT JOIN komentare k USING(id_clanek)
GROUP BY cl.id_clanek
pavel z
Profil
Opravdu moc děkuji, funguje to přesně jak má. Vůbec jsem nevěděl, že se dá tímto způsobem napsat podmínka i do SELECTu, asi bych si měl přečíst manuál k MySQL, ale je na mě příliš dlouhý, nesrozumitelný a polovinu toho už znam.
Ještě, možná je lepší nechat tam ten NULL, protože nových komentářů může být i nula, kdežto NULL, jsou vlastně nové všechny - tohle jde ale ošetřit přes PHP, jestli je smysluplné číslo v poli stamp_read.

Ještě jednou díky, Pavel
Toto téma je uzamčeno. Odpověď nelze zaslat.