Jump to content
php.lv forumi

nosaukumu atrašana pēc id


No0ne

Recommended Posts

Veidoju video skriptiņu, gribu parādīt kategorijas katram video, datubāzē tās ierakstu kā 1,2,3,4 cipariņus un otrā tabulā ir sarakstīts:

 

id = 1, name = trilleris, id = 2, name = asa sizeta.........

 

Pēc tam nolasu visu info par pasu filmu un kaut kā aizķēros pie tā kā parādīt kategorijas. Kategoriju ID es izvelku ārā, bet kā lai parādu nosaukumu? Negribu pie katra video (ja vienā lapā tādi ir 20) likt queryu, kas izvilks ārā filmas nosaukumu.

 

Kā lai to izdara vislabāk?

 

 

Nedaudz papildus info par tabulu strukturu:

 

video tabula:

id, name, kategorija laucini

 

video-kategoriju tabula:

id, name laucini

Edited by No0ne
Link to comment
Share on other sites

Super, gandrīz gatavs, tikai tagad, ja ir vairāki kategoriju ID, tad parāda tikai pirmo.

 

Tātad:

video tabula, norādīts id:1, name: video1, kategorijas: 5,6,7

video-kategorijas tabula, norādīts: id:5, name: Action; id:6, name: Trilleris; id:7, name:Asa sizeta

 

querys izdod:

name: video1, kategorija: Action

 

Kā, lai panāk, ka visi smuki parādās?

Edited by No0ne
Link to comment
Share on other sites

Tad jātaisa 3 tabulas:

 

CREATE TABLE  `test5`.`videos` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(45) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

CREATE TABLE  `test5`.`categories` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(45) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

CREATE TABLE  `test5`.`videoscategories` (
 `vid` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `cid` int(10) unsigned NOT NULL,
 PRIMARY KEY (`vid`,`cid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

 

 

Attiecīgi 3 tabula norāda, kuram video ir kādas kategorijas.

 

SELECT v.id,v.name,GROUP_CONCAT(c.name) FROM videos v, videoscategories vc, categories c WHERE v.id=vc.vid and vc.cid=c.id GROUP BY v.id

Edited by codez
Link to comment
Share on other sites

videos tabulā tu liec id, name

1 Avatars

2 Titāniks

3 Rokijs

 

categories tabulā tu liec kategorijas id, name

1 Fantastika

2 Bojeviks

3 Drāma

 

videoscategories tabulā tu liec vid, cid - video id un kategorijas id, kuri sasaista video ar konkrētajām kategorijām

vid cid

1 1

1 2

2 3

3 2

3 3

 

Attiecīg SELECT kverijam jāizvada:

1 Avatars Fantastika, Bojeviks

2 Titāniks Drāma

3 Rokijs Bojeviks,Drāma

Link to comment
Share on other sites

Ok, tātad man izdod ārā:

 

id name GROUP_CONCAT( c.name )

30 nosaukums Spriedzes filmas,Sausmu filmas,Trilleris

 

ja es gribu, lai ir links uz katru no siim filmaam (kārtot pēc kategorijas), tad man vajag arī katras kategorijas ID parādīt ar php <a href=?kategorija=$cat>$cat-nosaukums</a>, tad kā man dabūt katru ID, lai atbilstu kategorijas nosaukumam?

 

p.s. codez, kā tev šķiet ir kāds variants ar 2 tabulām un šādi (1,2,3..) ierakstītām kategorijām to izdarīt? Tīri interesei.

Link to comment
Share on other sites

p.s. codez, kā tev šķiet ir kāds variants ar 2 tabulām un šādi (1,2,3..) ierakstītām kategorijām to izdarīt? Tīri interesei.

Izdarīt jau var visu. Bet ar vienu kveriju šķiet nevarēs, vajadzēs divus.

 

Šādā gadījumā, ja teiksim tev ir atlasīts saraksts ar video, tad tev nāksies ar ciklu iet cauri visiem video un taisīt explode kategorijām, tad vēl kādā masīvā glabāt kādas kategorijas vispār tajos video un tad beigās taisīt vēl vienu selectu, lai noselektotu visas tās kategorijas, kuras ir konkrētajā atlasīto video sarakstā.

 

Vēl pastāv variants katru reizi nemeklēt tieši kādas kategorijas ir video sarakstā, bet atlasīt visas kategorijas. Un pārveidot tā, lai kategoijus masīvs būtu indeksēt pēc kategorijas id, respektīvi $cats[12], atgrieztu kategoriju ar id=12.

 

 

P.S. Kas attiecas uz 3 tabulu varainatu, tad tajā GROUP_CONCAT var salikt vairāk informāciju, lai varētu uzbūvēt arī linku.

Piemēram,

SELECT v.id,v.name,GROUP_CONCAT(CONCAT('{id:',c.id,',name:"',c.name,'"}')) FROM videos v, videoscategories vc, categories c WHERE v.id=vc.vid and vc.cid=c.id GROUP BY v.id

tagad 3 kolonna būs jāieliek papildus [ ] un būs json masīvs, kuru ar json_decode pārtaisa PHP masīvā, kurš saturēs kategoriju id un nosaukumus.

Edited by codez
Link to comment
Share on other sites

Es domāju, ka šis variants:

 

Vēl pastāv variants katru reizi nemeklēt tieši kādas kategorijas ir video sarakstā, bet atlasīt visas kategorijas. Un pārveidot tā, lai kategoijus masīvs būtu indeksēt pēc kategorijas id, respektīvi $cats[12], atgrieztu kategoriju ar id=12.

 

varētu būt vislabākais. Tātad taisu selektu visām kategorijām, ko pēc tam?

Link to comment
Share on other sites

atlasi kategorijas, ciklā izveido masīvu, tālāk atlasi video un ciklā ejot cauri ņem video tabulas lauku cats, kurā ir kategorijas formā 1,2,3, taisi explode un ciklā izvadi kategorijas, datus ņemot no pirms tam uztaisītā $cats masīva.

$db=new mysqli('localhost','root','','test');
$res=$db->query('SELECT * FROM categories');
$cats=array();
while ($row=$res->fetch_assoc()){
 $cats[$row['id']]=$row;
}

//tālāk atlasi video, piemēram, pēdējos desmit
$res=$db->query('SELECT * FROM videos ORDER BY id DESC LIMIT 10');
while ($row=$res->fetch_assoc()){
 echo 'Filma: '.$row['name'].'<br />';
 echo 'Kategorijas: ';
 foreach(explode(',',$row['cats']) as $catid){
   echo '<a href="/search?catid='.$catid.'">'.$cats[$catid]['name'].'</a> ';    
 }
 echo '<br />';
}

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...