Jump to content
php.lv forumi

Izvade no MySQL


ArnisR

Recommended Posts

Tātad MySQL datubāzē ir divas tabulas - viena ar kategorijām, otra ar sub-kategorijām.

 

1. tabulas datu lauki: ID - CATEGORY_NAME

2. tabulas datu lauki: ID - SUBCATEGORY_NAME - CATEGORY_ID

 

Nepieciešams šo informāciju izvadīt pēc šāda principa:

 

Kategorija 1

Subkategorija 1

Subkategorija 2

Subkategorija 3

Pārējās subkategorijas, kas atbilst kategorijai 1 ...

 

Kategorija 2

Subkategorija 1

Subkategorija 2

Subkategorija 3

...

 

 

Kā to var panākt ar PHP? Paldies!

Edited by ArnisR
Link to comment
Share on other sites

<?PHP
$q = mysql_query("SELECT * FROM `kategorijas`");
while ($res = mysql_fetch_object($q))
   {
   echo $res->CATEGORY_NAME . ':<br/>';
   $sub = mysql_query("SELECT * FROM `subkategorijas` WHERE `CATEGORY_ID`='" . $res->ID . "'");
   while ($sub_res = mysql_fetch_object($sub))
       {
       echo $sub_res->SUBCATEGORY_NAME . ':<br/>';
       }
   }
?>

Link to comment
Share on other sites

Vispār jau to var vienkārši panākt arī ar vienu kveriju:

$db=new Mysqli('localhost','root','','test');
$res=$db->query('SELECT * FROM cat LEFT JOIN subcat ON cat.id=subcat.CATEGORY_ID ORDER BY cat.id ASC');
$catid=Null;
while ($row=$res->fetch_assoc()){
 if ($catid!=$row['CATEGORY_ID']){
   echo $row['CATEGORY_NAME'].'<br />';
   $catid=$row['CATEGORY_ID'];    
 }
 echo $row['SUBCATEGORY_NAME'].'<br />';  
} 

Link to comment
Share on other sites

<?PHP
$q = mysql_query("SELECT * FROM `kategorijas`");
while ($res = mysql_fetch_object($q))
   {
   echo $res->CATEGORY_NAME . ':<br/>';
   $sub = mysql_query("SELECT * FROM `subkategorijas` WHERE `CATEGORY_ID`='" . $res->ID . "'");
   while ($sub_res = mysql_fetch_object($sub))
       {
       echo $sub_res->SUBCATEGORY_NAME . ':<br/>';
       }
   }
?>

Šai kodā ir vismaz 2 lietas no tām 7, par ko reiz rakstīju, kursori (BTW vēl trakāk cikls ciklā jeb kursors kursorā) un visu kolonu atlasīšana, kaut gan reāli nepieciešamas tik 2. Vismaz par to pirmo es teiktu, ka jebkurā kaut cik normālā projektā koderim būtu jādod maksimums 1 brīdinājums un iespēja pierādīt sevi, pēc otrās reizes sakot ardievas, jo pēc tam ieguldāmais darbs koda labošanā visdrīzāk stingri pārsniegs ieguvumu no konkrētā programmētāja.

 

Gints Plivna

http://datubazes.wordpress.com

Link to comment
Share on other sites

1. tabulas datu lauki: ID - CATEGORY_NAME

2. tabulas datu lauki: ID - SUBCATEGORY_NAME - CATEGORY_ID[/code]

U mad SQL guru? Ja cilvēks pasaka, ka jamam ir 2 datu lauki no kuriem 2 ir nepieciešami 1. gadījumā, vai man ir tiesības jamo apšaubīt? 2. gadījumā, tik tiešām, varēja fečot kolonnas. TEORĒTISKI. Lai gan probably ja šams veidotu linkus uz subkategorijām, pieņemu, ka jamam būtu nepieciešamas visas 3 no 3 kolonnām. Labākajā gadījumā divas. Tātad tukša bikšu kulšana, ja vajag visas kolonnas, paņem visas kolonnas. Oponē man.

Par nestotajām query-

<?PHP

/* SQL, autoģenerēts, stfu/gtfo

CREATE TABLE IF NOT EXISTS `nested-menu` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `childof` int(10) DEFAULT '0',
 `name` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`id`)
) AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

*/

$act      = mysql_query("SELECT * FROM `nested-menu`"); ///Problem, SQL guru?
$menu     = array();
$menu_sub = array();
while ($res = mysql_fetch_object($act))
   {
   #Ja childof = 0, šī ir master kategorija
   if ($res->childof == 0)
       {
       $menu[$res->id] = $res->name;
       }
   else
       {
       #Probably child kategorija
       $menu_sub[$res->childof][] = array(
           $res->id,
           $res->name
       );
       }


   }
#OMMG FOREACH!111!!!111
foreach ($menu as $id => $name)
   {
   # $id = kategorijas id
   # $name = kategorijas nosaukums
   echo $name . '<br/>';
   if (isset($menu_sub[$id]))
       {
       foreach ($menu_sub[$id] as $subid)
           {
           # [0] = subkategorijas id
           # [1] = subkategorijas nosaukums
           echo '-'.$subid[1] . '<br/>';
           }
       }

   }
?>

Ir piektdienas nakts, man ir lieliska vīna pudele un nē, tev nav man jāaizrāda par foreach un masīviem :D SQL guru gribēja optimizēt SQL? Just did. ija 2 tabulas, tagad ir viena, bija 5 kolonnas, tagad ir 3. Nedaudz vairāk PHP, bet whatevs. 2011.

 

Un par to max 1 brīdinājumu gan sanāca smiekli.

No offense SQL guru, esmu rakājies pa tavu blogu un priecē, ka dalies ar savām zināšanām, kā arī nenoliedzami neesi caur palagu ar slapju pirkstu taisīts. Bet tā attieksme, ak vai..

Edited by F3llony
Link to comment
Share on other sites

Es tev prasīju norādīt uz manām kļūdām un PAMATOT kāpēc tieši šīs būtu kļūdas TAVUPRĀT. es neprasīju citēt citus lietotājus.

Kas tur ko pamatot, kāda jēga glabāt uz servera divas temp tabulas un ņemt katrā pieprasījumā pa vienai rindai (pietam kā objektus)? Paņemt uzreiz visu un miers, nebūs jau tur gigabaitu rezultāti.

 

Edit: Kaut gan, pag. No kurienes tur kursori uzradīsies? mysql_query tak atdod visus rezultātus atpakaļ, fetch tak uz serveri vairs nelīdīs?

Edited by Rincewind
Link to comment
Share on other sites

Loģiski, ka nekādu mysql kursoru tur nav. Es gan nebiju šo tik dziļi pētījis, jo nebija nekādas intereses tieši par šo funkciju, bet izrādās, php mysql paplašinājums tik tiešām kopē mysql query atgriezto resultsetu lokālā atmiņā, kurā tad pēcāk arī tiek īstenots fetch loops. Kas ir loģiski.

 

 

Rincewind->karma++;

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