Jump to content
php.lv forumi

sql vaicaajums


hu_ha

Recommended Posts

ir atbildeets :\

 

ir divas tabulas:

tab_a
-------------
id | name
-------------
1 | a
2 | b 
3 | c
4 | d

tab_b
----------------
k_id| id_kom
----------------
1    | 2
2    | 3
3    | 2
4    | 2

id un k_id ir primary key autoincrement

vaiceejuma rezultaataa vajadzeetu ieguut:
rez
--------------------------
name| id_kom_skaits
--------------------------
a      | 0
b      | 3
c      | 1
d      | 0

 

taisu vaicaajumu:

select name, count(id_kom)

form tab_a,tab_b

where tab_a.id=tab_b.id_kom

group by id_kom

 

tiek atgriezti b=3 un c=1

vajag lai tiktu atgriezti arii rezultaati, kur a=0 un b=0

Edited by hu_ha
Link to comment
Share on other sites

select name, count(id_kom) from tab_a left join tab_b ON (tab_a.id=tab_b.id_kom) group by id_kom

tomeer nav iisti pareizi, shitais variants straadaa ja tabulaa "tab_b" ir vismaz par vienu ierakstu vairaak kaa "tab_a".

 

dotajaa gadiijumaa man atgriezh rezultaatu:

--------------------------
name| id_kom_skaits
--------------------------
a      | 0
b      | 3
c      | 1

 

truukst rindinja kur d=0

kaut kaa savaadaak vajadzees..

Link to comment
Share on other sites

nus vai tieshaam neviens nevar atbildeet? shitais ir standarta variants maajas lapaam, kad tiek paraadiits komentaaru skaits pie katra raksta...

tikai negribas taisiit 2vus vaicaajumus:

select * from raksts
while ...
        {
       select count(*) from komentaars where id=raksta_id
         }

gribeetos to uzmociit vienaa vaicaajumaa... vai tas ir iespeejams jeb tomeerj jaamoca vaicaajums ciklaa?

Link to comment
Share on other sites

Ja tu gribi, lai parādās ar dažādiem vārdiem (a,b,c,d), tad jāraksta:

 

select name, count(id_kom) from tab_a left join tab_b ON (tab_a.id=tab_b.id_kom) group by name

 

Tu lietoji:

 

select name, count(id_kom) from tab_a left join tab_b ON (tab_a.id=tab_b.id_kom) /*group by id_kom*/

 

Ja noņem group by ..., tad sanāk, ka tu izvēlies 4 ierakstus. Ar group by tiek sagrupēti tie lauki, kuros ir vienāds lauciņš pēc kura tiek veidots group by, tavā gadījumā - id_kom. Tā kā gan c gan d ir 0 komentāru (tu grupē pēc id_kom, kas viņiem abiem ir NULL), tie sagrupējoties viens otru pārklāj un tu rezultātos redzi tikai pirmo - c.

 

Visbeidzot, vajadzētu mēģināt izvēlēties tādu tabulas kolonnu nosaukumus, kas kaut ko pastāsta par savu būtību: k_id un id_kom - nekas pašsaprotamāks nav redzēts pēdējos simt gados. Iesaku izmainīt uz:

 

1) tabula:

entry_id

entry_name

2) tabula

comm_id

comm_entry

 

Bez tam, tabulu nosaukumos izmantot vārdu priedēkli tab vai table ir tas pats, kas tevi saukt nevis, piemēram par Mārtiņu, bet par CilvēkMārtiņu. Tabulām parasti dod nosaukumu pēc to satura. Ja tā satur bloga ierakstus, tad entries (daudzskaitlī). Ja tā satur komentārus, tad comments un nevis comment_table, comment, tab_a, tab_comm u.tml. Pirms comments var uzlikt priedēkli, lai gadienā ja uz vienas bāzes ir vairākas līdzīgs sistēmas, varētu atšķirt, piemēram: test_entries, test_comments, production_entries, production_comments.

Link to comment
Share on other sites

vo, beidzot ir, lielais paldies.

 

tagad ja paraada kaa vajadzeeja tad liekas stipri logjiski ka taa vajadzeeja dariit, bet taapat dabesiijos un nevareeju iebraukt..

 

btw: par tabulu nosaukumiem utt. shiis divas tabulas tika izmantotas, lai tiku pie vajadziigaa rezultaata un ir tikai gabalinjsh no vaicaajuma.. liidz ar to tabulu nosaukumi ir pavisam citi utt..

 

veelreiz paldies

Link to comment
Share on other sites

  • 1 year later...

Uzdevums tas pats - komentāru saskaitīšana rakstiem

 

Sākotnēji bija tā:

 

$q = mysql_query("SELECT posts.* FROM posts");
while ($r = mysql_fetch_assoc($q)) {
...
$q2 = mysql_query("SELECT COUNT(id) FROM comments WHERE post_id = '$id'";
...
}

izpildes laiks 1.5 - 2 sekundes

Tas protams nav sevišķi racionāli, jo ciklā tiek atkārtots tas pats query, tāpēc nodomāju šo lietu optimizēt un salikt visu vienā vaicājumā:

$q = mysql_query("SELECT posts.*, COUNT(comments.id) skaits FROM   posts, comments WHERE posts.id = comments.raksta_id GROUP BY posts.id");

šis kods izpildījās <0.5 sekundēs - ātruma ieguvums liels, tikai, kā jau minēja šīs tēmas autors, netiek atlasīti tie raksti, kam nav neviena komentāra. Tāpēc mēģināju izmantot LEFT JOIN un vaicājums izskatījās apmēram tā:

$q = mysql_query("SELECT posts.*, COUNT(comments.id) skaits FROM  posts LEFT JOIN comments ON posts.id = comments.raksta_id  GROUP BY posts.id");

šis kods strādāja kā vajadzīgs, bet izpildījās veselas 5-6 sekundes - 3 reizes ilgāk kā sākotnējā versija ar ciklu.

Vai tas ir normāli, ka LEFT JOIN izpildās tik ilgi, vai arī esmu kaut kur kļūdījies?

Link to comment
Share on other sites

×
×
  • Create New...