No0ne Posted April 24, 2011 Report Share Posted April 24, 2011 (edited) 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 April 24, 2011 by No0ne Quote Link to comment Share on other sites More sharing options...
Rincewind Posted April 24, 2011 Report Share Posted April 24, 2011 SELECT video.*, video-categories.name FROM video JOIN video-categories ON video.kategorija = video-categories.id Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 25, 2011 Author Report Share Posted April 25, 2011 (edited) 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 April 25, 2011 by No0ne Quote Link to comment Share on other sites More sharing options...
codez Posted April 25, 2011 Report Share Posted April 25, 2011 (edited) 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 April 25, 2011 by codez Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 25, 2011 Author Report Share Posted April 25, 2011 Pamēģināju, sql neko neatgrieza, nomainīju gan cid kolonnu uz varchar, lai komatu var ielikt starp kategorijām. Lūdzu ņem vērā, ka man vienam video var būt vairākas kategorijas, tās ierakstu DB kā 1,2,3... Quote Link to comment Share on other sites More sharing options...
codez Posted April 25, 2011 Report Share Posted April 25, 2011 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 Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 25, 2011 Author Report Share Posted April 25, 2011 Nepareizu ID biju ievadījis, darbojas super! Liels paldies! Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 25, 2011 Author Report Share Posted April 25, 2011 Hmm, nē, neizpētīju līdz galam pirms tam, man parāda vienu no trim kategorijām, kas ir piešķirta filmai. Kā lai parāda visas 3? vid = 1, cid = 5,6,7 Quote Link to comment Share on other sites More sharing options...
waplet Posted April 25, 2011 Report Share Posted April 25, 2011 vajag veikt ciklu, lai izvadītu visas 3 Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 25, 2011 Author Report Share Posted April 25, 2011 vajag veikt ciklu, lai izvadītu visas 3 un kā, lai zinu cik reizes ciklēt un vispār ko tieši likt ciklā? Quote Link to comment Share on other sites More sharing options...
codez Posted April 25, 2011 Report Share Posted April 25, 2011 (edited) nevajag ciklu, Vajag katrai raksta kategorijai ierakstu tabulā. Nevis 1 5,6,7 bet 3 ierakstus: 1 5 1 6 1 7 Edited April 25, 2011 by codez Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 25, 2011 Author Report Share Posted April 25, 2011 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. Quote Link to comment Share on other sites More sharing options...
codez Posted April 26, 2011 Report Share Posted April 26, 2011 (edited) 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 April 26, 2011 by codez Quote Link to comment Share on other sites More sharing options...
No0ne Posted April 26, 2011 Author Report Share Posted April 26, 2011 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? Quote Link to comment Share on other sites More sharing options...
codez Posted April 26, 2011 Report Share Posted April 26, 2011 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 />'; } 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.