Autor Zpráva
Kcko
Profil
Dobry vecer,

jsem unaveny a hlava mi to nejak nedokaze vymyslet.

Mam diskusni forum, klasickou tabulku kam si ukladam prispevky a dale tabulku kam si ukladam kdy jsem jaky topic navstivil naposledy ( resp za jednotlive uzivatele )

Nyni potrebuji vytahnout kolik je novych prispevku za uzivatele

SELECT COUNT( t1.id ) , topic_id
FROM forum_posts t1
LEFT JOIN forum_topics_read t2
USING ( topic_id )
WHERE (t2.dt < t1.dt AND t2.poster_id =1) 
GROUP BY topic_id


Tento dotaz funguje bezproblemove, ale pouze tehdy, navstivil jsem aspon 1x dany topic.
Pokud nekdo zalozi topic, napisi se do nej nejake prispevky a ja ho jeste nenavstivil tak mi ho dotaz nevyplivne.
Logicky , nemam zadnou vazbu ani zaznam v tabulce forum_topics_read

Nevim jak to vyresit. Pomuze nekdo?

(Budu to samozrejme zkouset ..)
Kcko
Profil
Tak uz to mam

SELECT SUM(t2.dt < t1.dt) , topic_id
FROM forum_posts t1
JOIN forum_topics_read t2
USING ( topic_id )
WHERE ( t2.poster_id =1) 
GROUP BY topic_id


Ale je to podle me hrozne reseni, scita mi to zaznam po zaznamu, ale na neco s "COUNT(*)" nemuzu prijit.

Kajmane? :)
Kajman_
Profil *
Co podmínku na postera hodit do left joinu?

LEFT JOIN forum_topics_read t2
ON t2.topic_id=t1.topic_id  AND t2.poster_id =1
WHERE t2.dt is null OR t2.dt < t1.dt
Kcko
Profil
Tak jsem to mel samozrejme v 1 dotazu viz vyse, ale vyhazoval mi jen TOPICY ktere jsem navstivil a ve kterych bylo neco noveho.

Ja bych potreboval vsechny topicy a u nich cislo ( 0 nebo > 0 cili nove prispevky )



REATE TABLE `forum_topics_read` (
  `topic_id` mediumint(9) NOT NULL,
  `poster_id` mediumint(9) NOT NULL,
  `dt` datetime NOT NULL,
  UNIQUE KEY `topic_id` (`topic_id`,`poster_id`),
  KEY `topic_id_2` (`topic_id`),
  KEY `poster_id` (`poster_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci;



CREATE TABLE IF NOT EXISTS `forum_posts` (
  `id` mediumint(9) NOT NULL auto_increment,
  `first_message` tinyint(4) NOT NULL,
  `theme_id` mediumint(9) NOT NULL,
  `topic_id` mediumint(9) NOT NULL,
  `dt` datetime NOT NULL,
  `poster` mediumint(9) NOT NULL,
  `parent` smallint(6) NOT NULL,
  `title` varchar(150) collate utf8_czech_ci NOT NULL,
  `message` text collate utf8_czech_ci NOT NULL,
  `cenzura` tinyint(4) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `parent` (`parent`),
  KEY `poster` (`poster`),
  KEY `theme_id` (`theme_id`),
  KEY `topic_id` (`topic_id`,`dt`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_czech_ci AUTO_INCREMENT=152 ;





Jinak prvni dotaz fungoval tak ze mi nasel jen nove prispevky v topicich ktere jsem uz navstivil
a druhy dotaz po nynejsim otestovani nefunguje vubec korektne :/
Kajman_
Profil *
Tak jsem to mel samozrejme v 1 dotazu viz vyse.

Kdepak. V prvním to máš ve where. Musíš dát podmínku na uživatele přímo do left joinu. Právě to způsobí, že tam budou i nenavštívená vlákna.
Kcko
Profil
SELECT COUNT( t1.id ), t1.topic_id 
FROM forum_posts t1
LEFT JOIN forum_topics_read t2
ON t2.topic_id=t1.topic_id  AND t2.poster_id =1
WHERE t2.dt is null OR t2.dt < t1.dt
GROUP BY t1.topic_id


Skvele. Ted to vyplivne navstivena i nenavstivena vlakna kde je neco noveho.
Slo by do toho zakomponovat kompletni vypis vsech topicu? ( Vim ze to je blbost, v aplikaci to stejne potrebovat nebudu, ale kdyby byla ta moznost .. )
Kajman_
Profil *
Dát tam tu sumu.

SELECT SUM(t2.dt is null OR t2.dt < t1.dt) pocet , topic_id
FROM forum_posts t1
LEFT JOIN forum_topics_read t2
ON t2.topic_id=t1.topic_id  AND t2.poster_id =1
GROUP BY t1.topic_id
Kcko
Profil
Az pujdes na lobotomii zamlouvam si tu cast, ktera Ti vymysli SQL dotazy! :)
Funguje to, sice mi to projizdi vsechny prispevky v tabulce POST ( index tam je ) ale to je vedlejsi uz. DIKY !
Kajman_
Profil *
Pokud budes vypisovat jen část vláken, mohl by být rychlejší kolerovaný dotaz nebo jak se tomu říká.

select
(select count(*) from forum_posts t1
 LEFT JOIN forum_topics_read t2
 ON t2.topic_id=t1.topic_id  AND t2.poster_id =1
 where t1.topic_id=t3.topic_id and (t2.dt is null OR t2.dt < t1.dt)) pocet, 
t3.topic_id
from vlakna t3
-- nejake omezeni vlaken
Kcko
Profil
budu vypisovat jen cast vlaken ale stejne se to nejdriv nacte do pole ( dotaz je omezen limitem )
a pak 1 dotaz navic na zjisteni novych prispevku neni problem.

Ten dotaz cos mi pomohl vymyslet mi krasne staci.
Kcko
Profil
Kajman je buh a timto zamykam
Toto téma je uzamčeno. Odpověď nelze zaslat.