Bu sual tanış gəldi:
MySql ile bolmeni ve altbolmeni cixarmaq
Ə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.
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
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]
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]
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
Ç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ü?
İ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]
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
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ü.
MySQL – Var olan data nı silmədən update və ya insert etmək