Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 7. 1. 2009, 20:04:02 · Upravil/a: Kcko
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 |
#2 · Zasláno: 7. 1. 2009, 20:59:41 · Upravil/a: Kcko
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 * |
#3 · Zasláno: 7. 1. 2009, 21:05:56
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 |
#4 · Zasláno: 7. 1. 2009, 21:15:14
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 * |
#5 · Zasláno: 7. 1. 2009, 21:22:45
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 |
#6 · Zasláno: 7. 1. 2009, 21:29:18
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 * |
#7 · Zasláno: 7. 1. 2009, 21:31:59
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 |
#8 · Zasláno: 7. 1. 2009, 21:35:46
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 * |
#9 · Zasláno: 7. 1. 2009, 21:45:20
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 |
#10 · Zasláno: 7. 1. 2009, 21:52:32
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 |
#11 · Zasláno: 7. 1. 2009, 22:21:37
Kajman je buh a timto zamykam
|
||
Časová prodleva: 15 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0