Jump to content
php.lv forumi

Kā saskaitīt datus iekš datubāzes?


forSilence

Recommended Posts

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 by forSilence
Link to comment
Share on other sites

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')

Link to comment
Share on other sites

 

Šā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?

Link to comment
Share on other sites

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 by Maris-S
Link to comment
Share on other sites

  • 2 weeks later...

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

Link to comment
Share on other sites

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 by Vhubuo
Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...