Mysqlda bir neçə tabledən məlumat çəkmək

Salamlar. deməli belə bir sorgu var. Mysql bazada bölmələr və həmən bölmələrin hərəsinə aid alt bölmələr var. Və mən istəyirəmki bölmələr görünsün və hər bölmənin də alt bölməsi öz altında sıralansın. məsələn belə. Bölmə 1 altbölmə1 altbölme2 -- Bölmə2 altbölmə3 altbölmə4 bu tip çlxarmaq istıyəirəm. Qeyd edim ki hər bölmələr və alt bölmələr ayri ayri tablelerde saxlanılır.tutaq ki deyek beledi cedvel Bolme_table  (id,ad) Altbolme_table (id,ad,bolme_id) bunu dolayı yolla istədiyim nəticəni alıram. bazaya bir neçə sorğu göndərməklə. ama istəyirəmki bir sorğu ile hell edəm. əger mümkünsə. öz yazdiğım variant belədir [code] $bolme_sorgu = mysql_query("SELECT * FROM `bolmeler`"); while($bolme_array = mysql_fetch_assoc($bolme_sorgu)) { $altbolme_sorgu = mysql_query("SELECT * FROM `altbolmeler` WHERE `bolme_id` = '".$bolme_array['id']."'"); if(mysql_num_rows($altbolme_sorgu) < 1) { continue; } echo $bolme_array['ad'].'<br/>'; while($altbolme_array = mysql_fetch_assoc($altbolme_sorgu)) { echo $altbolme_array['ad']; }} [/code] Bu formada yazıram istediyim neticə alnır. sizce düzgün yazilişdı bu forma?  daha sadə və serverə daha az yuk vere bilecək bir yolu varmi? belə bir yolla da yoxladim ama yene istediyim netice alinmadi. [code] $sorgu = mysql_query("SELECT bolmeler.ad AS bolme_ad, altbolmeler.id AS altbolme_id, altbolmeler.ad AS altbolme_ad FROM bolmeler INNER JOIN altbolmeler ON altbolmeler.bolme_id = bolmeler.id"); while($array_sorgu = mysql_fetch_assoc($sorgu)) { echo $array['bolme_ad'].'<br/>'; echo $array['altbole_ad'].'<br/>'; } [/code]   bu formada da yazdim ama burda da yenə mən deyən nəticəni vermir. hər altbölməyə ayrı ayrılıqda bölmə adı verir təkrar.  veriləcək cavablara görə öncədən təşəkkürl edirəm

Verilmiş cavablar və yazılan şərhlər (10 cavab var)

Shahriyar Rzayev (2013-03-09 16:03:07)
Bu sual tanış gəldi: MySql ile bolmeni ve altbolmeni cixarmaq

VendeTTA (2013-02-10 23:16:06)
Əgər nəticə eynidirsə demək ki səhv yoxdur. Sadəcə sənə sürət maraqlıdırsa o halda bütün variantları yoxla hansı daha tez yerinə yetirsə onu seçə bilərsən.

Emin Rəhmanov (2013-02-10 19:53:13)
Burda bolmeye gore yazmamisam. bolme onsuzda her defe odenir. onu altbolmeyye gore yazmisam. eger o bolma bosdurse alt bolmesi yoxdursa onda bos bolmeni ekrana vermesin

Emin Rəhmanov (2013-02-10 19:45:49)
Tesekkurler. bele bir yolla yazdim men ve eyni neticeni aldim. ama bilmirem ne derecede duzgundu yazdigim. [code] <?php $sorgu = mysql_query("SELECT CONCAT(bolmeler.ad) AS bolme_ad, GROUP_CONCAT(altbolmeler.id) AS altbolme_id, GROUP_CONCAT(altbolmeler.ad) AS altbolme_ad FROM bolmeler JOIN altbolmeler ON altbolmeler.bolme_id=bolmeler.id GROUP BY bolmeler.id"); while($array = mysql_fetch_assoc($sorgu)) { echo $array['bolme_ad'].'<br/>'; $altbolme_id = explode(',', $array['altbolme_id']); $altbolme_ad = explode(',', $array['altbolme_ad']); for($i = 0; $i < count($altbolme_id); $i++) { ?> <input type="checkbox" value="<?php echo $altbolme_id[$i]; ?>" name="altbolme_id[]"/> <?php echo $altbolme_ad[$i]; ?><br/> <?php }} ?> [/code]

VendeTTA (2013-02-10 13:11:36)
Adətən bölmələr az olur, ona görə də massivə salmaq olar. Nümunə: [code]$bolme = array(false,'Ölkə','Brauzer','Operator'); $count = sizeof($bolme) - 1; for($i=1;$i<=$count;$i++) { echo $bolme[$i] . '<br/>'; $r = mysql_query("SELECT `id`,`ad` FROM `altbolmeler` WHERE `bolme_id` = '" . $i . "'"); while ($a = mysql_fetch_assoc($r)) { echo $a['id'] . ' - ' . $a['ad'] . '<br/>'; } }[/code]

VendeTTA (2013-02-10 12:56:38)
Aydındır. Bu halda öz yazdığın koddan fərqli olaraq ancaq massivlərin köməyi ilə sürət qazanmaq olar. Amma hazırki kodda 1 artıq yoxlama var onu götürərsən. Bu şərtə ehtiyac yoxdur. Onsuzda $bolme_array ödənməyəndə dövr dayanır. [code] if(mysql_num_rows($altbolme_sorgu) < 1) { continue; } [/code] Massivlə nümunə istəsən köməklik edərəm

Emin Rəhmanov (2013-02-09 19:35:55)
Çox sağol cavaba görə. Ama yazdığınız kod mənə istədiyim nəticəni vermir axı. Orda yenə də hər dəfə həm bolme adini həmdə altbolmə adını verecək ekrana. Ama mənə lazımdıki bir hər bölməni bir dəfə versin və hər bölməyə aid olan altbölmələri də bölmənin altında sıralasın. fikrimi tam çatdırmaq üçün aşağıdakı kodu nümunə göstərim. Eynilə aşağıda qeyd etdiyim kodun verdiyi nəticəni almaq istəyirəm. [code] $bolme_sorgu = mysql_query("SELECT * FROM `bolmeler`"); while($bolme_array = mysql_fetch_assoc($bolme_sorgu)) { $altbolme_sorgu = mysql_query("SELECT * FROM `altbolmeler` WHERE `bolme_id` = '".$bolme_array['id']."'"); if(mysql_num_rows($altbolme_sorgu) < 1) { continue; } echo $bolme_array['ad'].'<br/>'; while($altbolme_array = mysql_fetch_assoc($altbolme_sorgu)) { ?> <input type="checkbox" value="<?php echo $altbolme_array['id']; ?>" name="operator_id[]"/> <?php echo $altbolme_array['ad']; ?><br/> <?php }} ?> [/code] Eynilə bu kodun verdiyi nəticə ama daha yüngül bazaya daha az yük verəcək bir kodla mümkündümü?

VendeTTA (2013-02-09 19:13:14)
İlk olaraq bunu deyim. Hər sorğuda əgər həmin table-da sütunlar çoxdursa SELECT * seçmək yanlışdır. Lazım olan sütunu seçməklə, bir sorğu ilə bir dövr yaratmaqla daha sürətli nəticə əldə edirik. Nümunə: [code] $q = mysql_query("SELECT `ad`,(SELECT `ad` FROM `altbolmeler` WHERE `altbolmeler`.`bolme_id` = `bolmeler`.`id` LIMIT 1) AS `ad2`,(SELECT `id` FROM `altbolmeler` WHERE `altbolmeler`.`bolme_id` = `bolmeler`.`id` LIMIT 1) AS `id` FROM `bolmeler` ORDER BY `id` ASC"); while($r = mysql_fetch_assoc($q)) { echo $r['ad'] . '<br/>' . $r['id'] . ' ' . $r['ad2'] . '<br/>'; } [/code]

Emin Rəhmanov (2013-02-09 16:10:18)
Təşəkkürlər cavaba görə. belə bir yolla yazarkən bir sorğu ilə hər 2 bölməni və altbölməni çıxardıram. [code] $query = mysql_query("SELECT bolmeler.ad AS bolme_ad, GROUP_CONCAT(altbolmeler.id) AS altbolme_id, GROUP_CONCAT(altbolmeler.ad) AS altbolme_ad FROM bolmeler JOIN altbolmelerr ON bolmeler.id=altbolmelerr.bolme_id GROUP BY bolmeler.id");[/code] belə təxmini mən istədiyim nəticəyə yaxin bir şey verir. belə [code] Array ( [bolme_ad] => Avtomobil [altbolme_ad] => Hundai,Porche [altbolme_id] => 1,2 ) [/code] bu çıxarılışı verir. ama bunu ekrana verəndə bu formada verir Avtomobil Hundai,Porche ama mən istəyirəm ki belə bir şey edəm. Avtomobil Hundai_id Hundai Porche_id Porche

Cabbarov Sübhan (2013-02-09 15:36:48)
Elə birinci etdiyin düzgündü, başqa bir sql sorğu ilə bunu rahat etmək olmaz məncə. Hansı cür də etsən yenə ikinci sorğu mütləq işləməlidi. Ancaq o da düzdü ki iki cədvəldən eyni anda bir sorğu ilə nəticə almaq olar, ama bu işin bölmə və alt bölməyə aidiatı yoxdu. Çünki əsəs bölmə olmasa onu alt bölməsidə tapıla bilməz, ona görədə mütləq iki sorğu işləyəcək bu prosesdə. Özünüz etdiyinin düzdü.

Mövzu üzrə bənzər suallara da baxa bilərsiniz.

php mysql boş columns

Təcili MySQL-də kömək

MySQL-Java

Apache, Cpanel`də problem.

MySQL – Var olan data nı silmədən update və ya insert etmək

MySQL sorğu