forSilence Posted August 29, 2010 Report Share Posted August 29, 2010 (edited) Esu gandrīz pabeidzis savu jaunumu skriptu, tik gribēju uzzināt, kā sataisīt vienu lietu. ir tabula: CREATE TABLE IF NOT EXISTS `news_komentari` ( `id` int(11) NOT NULL AUTO_INCREMENT, `nid` int(11) NOT NULL, `author` text COLLATE utf8_unicode_ci NOT NULL, `comment` text COLLATE utf8_unicode_ci NOT NULL, `date` datetime NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ; Kā sataisīt tā, lai parāda katram jaunumam atseviški kommentāru skaitu. Zinu kā sataisīt, lai parāda cik pavisam ir pievienotu komentāru datu bāzē, bet nezinu kām lai sataisa katam jaunumam atseviški. Šādā veidā es parādu cik pavisam komentāru: $result = mysql_query("SELECT * FROM news_komentari ORDER BY id DESC;"); $num_rows = mysql_num_rows($result); Un katras struktūras definējums: `id`- komentāra id `nid` - jaunumu id `author` -autors `comment` komentārs `date` - datums. Un pie reiz vēlējos kā, lai sataisa, lai rāda datumu šādi 2010,08,29 22:48 nevis šādi 2010-08-29 22:48:24 Edited August 29, 2010 by forSilence Quote Link to comment Share on other sites More sharing options...
codez Posted August 29, 2010 Report Share Posted August 29, 2010 Es glabātu katram jaunumam kolonnā, cik viņam ir komentāru. Pie komentāra pievienošanas vai dzēšanas šo lauku UPDATE-otu. Quote Link to comment Share on other sites More sharing options...
forSilence Posted August 29, 2010 Author Report Share Posted August 29, 2010 Es glabātu katram jaunumam kolonnā, cik viņam ir komentāru. Pie komentāra pievienošanas vai dzēšanas šo lauku UPDATE-otu. Vari visu sīkāk paskaidot par tiem UPDATE un skaidrāk, jo es tikai vēl mācos. Un ka man būtu tad jātaisa mysql tabulas Quote Link to comment Share on other sites More sharing options...
Code Posted August 29, 2010 Report Share Posted August 29, 2010 codez būtībā Tev iesaka izveidot Tavai jaunumu tabulai (pieņemu, ka 'news') papildus kolonnu, kurā tiek glabāts pašreizējais komentāru skaits un katru reizi, kad pievieno vai dzēs kādu komentāru, jaunumu tabulas laukam (kurā glabās to komentāru skaitu) tiek attiecīgi pieskaitīts vai atņemts vieninieks. Ja nevēlies veikt apdeitus, tad izveido apakšselektu. Katram jaunumam tu zināsi ID'u, pēc tā arī taisi selektu (SELECT COUNT(*) FROM news_komentari WHERE nid = konkrēta_jaunuma_id) Par datumu - vari izmantot DATE_FORMAT - DATE_FORMAT(date, '%d.%m.%Y %H:%i') Quote Link to comment Share on other sites More sharing options...
Kaklz Posted August 30, 2010 Report Share Posted August 30, 2010 Šādā veidā es parādu cik pavisam komentāru: $result = mysql_query("SELECT * FROM news_komentari ORDER BY id DESC;"); $num_rows = mysql_num_rows($result); Šādi darīt ir vissliktākais, ko var darīt! Aizmirsti par tādu konstrukciju tūlīt pat un atceries, ka, lai dabūtu objektu skaitu datubāzē ir jālieto MySQL COUNT() agregātfunkcija. $result = mysql_query("select count(*) from news_komentari"); $count = mysql_result($result, 0, 0) Tas, ko tu dari ir apmēram šādi: atlasam visus ierakstus (pie tam pēc ID sakārtotā secībā) komentāru tabulā no mysql servera, pārsūtam PHP, saskaitam cik rindiņu ir atgrieztajā rezultātu kopā un tad darbojamies tālāk. Tā vietā tu vienkārši vari paprasīt MySQL serverim ierakstu skaitu tabulā. Iedomājies, ka tev teiksim būs 1 000 000 komentāru. Lai tu dabūtu vienu ciparu, stumdīsi miljonu lielu datu kopu? Quote Link to comment Share on other sites More sharing options...
Maris-S Posted August 30, 2010 Report Share Posted August 30, 2010 (edited) Tavā gadījumā, ja Tu domā parādīt komentārus pie ziņu izvilkšanas, tad vienkāršākais variants, jau ar esošajām tabulām, būtu apmēram tāds: select a.*, count(b.id) as comment_count from news a left join news_komentari b on b.nid=a.id Protams vaicājumu nepārbaudīju, bet doma tāda ka Tu tabulas news datu izgūšanas laikā vienlaicīgi izvelc arī atbilstošo komentāru skaitu. Codez variants arī labs, bet ja negribi ar php skriptu katru reizi liekot vai noņemot komentārus veidot vēl vienu atsevišķu vaicājumu un ja Tev ir vēlēšanās mācīties dziļāk, tad paskaties mysql triggers. Datumu formatēt vari ar php funkciju date(), tikai sākumā Tev no datubāzes jādabū unix timestampu, to var izdarīt ar mysql funkciju unix_timestamp, to var atrast šajā sarakstā. Edited August 30, 2010 by Maris-S Quote Link to comment Share on other sites More sharing options...
forSilence Posted August 31, 2010 Author Report Share Posted August 31, 2010 Paldies visiem uz atsauci par datumu itkā es sapratu no Code, paldies Kaklz par iemācīšanu kā pareizāk saskaitīt datus, un tagad meigināšu saskaitīt komentārus pēc Maris-S parauga. Jā būs vēl jautājumi uzreiz prasīšu. Quote Link to comment Share on other sites More sharing options...
Uldis Posted September 14, 2010 Report Share Posted September 14, 2010 starp citu vai nebūs ātrāk, ja $result = mysql_query("select count(*) from news_komentari"); vietā izmantos $result = mysql_query("select count(id) from news_komentari"); ? Quote Link to comment Share on other sites More sharing options...
Grey_Wolf Posted September 14, 2010 Report Share Posted September 14, 2010 starp citu vai nebūs ātrāk, ja $result = mysql_query("select count(*) from news_komentari"); vietā izmantos $result = mysql_query("select count(id) from news_komentari"); ? nee nebuus, jo ja izmanto count(*) tad shis vrjants ir optimizets (Mysql viena no fiicham ) Quote Link to comment Share on other sites More sharing options...
Uldis Posted September 14, 2010 Report Share Posted September 14, 2010 acimredzot ne visas pamacibas par skriptu optimizaciju ir patiesas :) Starp citu uz Oracle jau šāda fīča nedarbojas? Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted September 14, 2010 Report Share Posted September 14, 2010 nee nebuus, jo ja izmanto count(*) tad shis vrjants ir optimizets (Mysql viena no fiicham ) Nemaz nerunājot par to, ka count(*) un count(id) vispārīgā gadījumā nav viens un tas pats... Gints Plivna http://datubazes.wordpress.com Quote Link to comment Share on other sites More sharing options...
Gints Plivna Posted September 14, 2010 Report Share Posted September 14, 2010 acimredzot ne visas pamacibas par skriptu optimizaciju ir patiesas :) Starp citu uz Oracle jau šāda fīča nedarbojas? Njā nu nevajag ticēt visam, kas rakstīts internetā, tāpat kā nevajag ticēt visam, kas rakstīts avīzēs ;) Ja Tu domā, ka Oracle faktiski glabā ierakstu skaitu, kā to dara MySQLs savām MyISAM tabulām serializējot operācijas, tad nē, Oracle tā nedara gan. Bet Oracle toties dara daudz ko citu ;) Gints Quote Link to comment Share on other sites More sharing options...
Vhubuo Posted September 15, 2010 Report Share Posted September 15, 2010 (edited) Ja man budu normala datubaze, nevis mysql es daritu ta: SELECT n.* , (SELECT count(*) FROM news_comments WHERE news_id = n.id) as news_comment_count FROM news as n; Bet man ir mysql kurak iekšiejie vaicajumi dažas versijas ir ļoti leni tapec daudz isu vaicajumu, es domaju, bus atrak: $sql = "SELECT * FROM news;"; $query = mysql_query($sql); while ($result = mysql_fetch_array($query){ $comment_sql = "SELECT count(*) FROM comments where news_id = ". $result['id']; list($comment_count) = mysql_fetch_array(mysql_query($comment_sql)); } Bet, man varbut ir novecojusi informacija. Edited September 15, 2010 by Vhubuo Quote Link to comment Share on other sites More sharing options...
Леший Posted September 15, 2010 Report Share Posted September 15, 2010 Ja man budu normala datubaze, nevis mysql es daritu ta: SELECT n.* , (SELECT count(*) FROM news_comments WHERE news_id = n.id) as news_comment_count FROM news as n; Ar šādiem qverijiem arī rodās iespaids, ka mysql ir kaut kas slikts. Kā domā, kas notiks ar šo: SELECT n.* .... , ja tev ir vairāki tukstoši ierakstu? Ne limita, nekas! Šis kverijs pat nav loģisks, jo tev nekad nekur nebūs neviena kontroliera, kas strādās ar visiem n-tiem tukstošiem ierakstu. Quote Link to comment Share on other sites More sharing options...
Vhubuo Posted September 15, 2010 Report Share Posted September 15, 2010 Ar šādiem qverijiem arī rodās iespaids, ka mysql ir kaut kas slikts. Rodas tads iespaid tapēc ka mysql tadi vaicajumi leni strada. Kā domā, kas notiks ar šo: SELECT n.* .... , ja tev ir vairāki tukstoši ierakstu? Ne limita, nekas! Nekas ipaš, viņš vienkarši paskaitis to ko es gribu visiem ierakstiem. Piemeram ja man vajag atskaiti. Man ir tulkstoši ierakstu un reizem saražģitakie vaicajumi, bet vis strada normali. Šis kverijs pat nav loģisks, jo tev nekad nekur nebūs neviena kontroliera, kas strādās ar visiem n-tiem tukstošiem ierakstu. Tas, diemžel ari nav taisniba, jo tā rezultats ir tieši tas kas bija prasits 1 ieraksta un tur ari nebija nekadu limitu. Un es nedomaju ka LIMIT 10,0 ienes daudz loģikas vaicajumā. Es domaju ka paging ir cits uzdevums. Un to ir viegli uztaisit. Un man ir "kontroleri" kas strada ar tulkstošiem ierakstu. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.