Friiks Posted February 4, 2008 Report Share Posted February 4, 2008 Sveiki! Gribēju pajautāt un cerams arī saņemt atbildi uz jautājumu, kas mani tracina krietnu laiku. Tātad, esmu uzmeistarojis mazu forumu ar standartfunkcijām - topiku veidošana, atbildēšana uz topikiem utt. Problēma ir tāda, ka nevaru izdomāt veidu kā sakārtot topikus tā, lai topiks ar jaunāko postu būtu pašā augšā, ar otro jaunāko zem tā utt. Tā kā jebkurā forumā :P Ja topiku atbildes un pats topiks būtu vienā table'ā tad problēmu nebūtu, bet topikiem man ir viens table un to atbildēm cits. Mēģināju lietot šādu query'ju, bet nekas nesanāca, izmēģinājos arī ar UNION, bet rezultāts visu laiku viens - nekāds. Varbūt varat norādīt uz kļūdu? "SELECT DISTINCT r.`forum_id`, t.`title`, t.`user_id`, t.`description`, t.`id` FROM `forum_topics` t, `forum_topic_replies` r WHERE t.`forum_id` = '".$showforum."' AND r.`fid` = '".$showforum."' ORDER BY r.`time` DESC LIMIT ".$limit.",10" `time` lauks ir pēdējās atbildes timestamps. Paldies! P.S. Atvainojos par nelatviskajiem apzīmējumiem, bet gluži vienkārši tos nepārzinu. Link to comment Share on other sites More sharing options...
Roze Posted February 4, 2008 Report Share Posted February 4, 2008 Ja pareizi no kverija saprotu tu mēģini topicu tabulai piejonot replayu tabulu un pēc replayu tabulas timestampiem atrast jaunākos topicus. Tas ir diezgan sarežģīti (jebšu pareizāk uz MySQL nezinu nevienu pieņemamu/smuku veidu kā to izdarīt vispār) jo tabula tiek joinota pēc id .. attiecīgi DISTINCT rezultāts visdrīzāk vienmēr trāpās vecākais replays (jo orderēšana/grupēšana notiek pēc joina). Pareizi būtu topicu tabulā ielikt vēl vienu datetime lauku last_replay (kuru tu updeito (uz NOW()) kad tiek iemests jauns replays) un tad atlasīt sanāk šādi: SELECT * FROM `forum_topics` ODER BY `last_replay` DESC LIMIT ... Būs krietni ātrāk un vienkāršāk.. Link to comment Share on other sites More sharing options...
Friiks Posted February 4, 2008 Author Report Share Posted February 4, 2008 (edited) Saprati mani pareizi...hm, un šķiet, ka būs jādara kā teici! Cerēju izbraukt ar viena table traumēšanu ar posta pievienošanu. Paldies! :) ..kautgan māc ziņkārība kā visi IPB,PHPBB,MyBB,SMF utt. cilvēki to dara.. Edited February 4, 2008 by Friiks Link to comment Share on other sites More sharing options...
Roze Posted February 4, 2008 Report Share Posted February 4, 2008 Cerēju izbraukt ar viena table traumēšanu ar posta pievienošanu.Šeit ir diezgan vienkārši - lasīšanas/apskatīšanas būs krietni vairāk nekā rakstīšanas (replaji) līdz ar to tas ekstra kverijs pie replaya būs krietni minimāls salīdzinot ja tu pirmajā lapā mēģināsi veidot kaut kādus joinus / unionus utt.. IPB topicu tabulai ir last_post lauks ar timestampu (tāpat arī last_poster) .. viņi pat ātrdarbības labad glabā arī last_poster_name un creator_name nevis linko no user tabulas.. Link to comment Share on other sites More sharing options...
Aleksejs Posted February 5, 2008 Report Share Posted February 5, 2008 Nu, (riskējot, ka kļūdos) tas būtu kaut kā šādi... SELECT r.`forum_id`, t.`title`, t.`user_id`, t.`description`, t.`id` FROM `forum_topics` t LEFT JOIN `forum_topic_replies` r ON t.`id` = f.`fid` WHERE r.`time` IN (SELECT max(r2.`time`) FROM `forum_topic_replies` r2 WHERE r2.`fid` = t.`id`) ORDER BY r.`time` DESC Par to forum_id nesapratu, kam tas vajadzīgs, ja vajadzīgs, tad pieliec ar AND vēl klāt aiz galvenā vaicājuma WHERE. Link to comment Share on other sites More sharing options...
Recommended Posts