Ebeveyn / çocuk kategorilerdeki öğelerin sorgu sadece belirtilen sayıda

2 Cevap php

Ben sorun belli bir kategori içinde her öğe sorgulamak ve yalnızca tarihe göre yeni 10 öğeleri listelemek için nasıl sergiyi yaşıyorum. İşte benim masa düzeni:

download_categories

category_id (int) primary key
title (var_char)
parent_id (int)</pre></code>

downloads

id (int) primary key
title (var_char)
category_id (int)
date (date)</pre></code>

Ben diyelim ki bir ana kategorisinde her dosyayı sorgulamak gerekiyor, diyelim ki, 100 madde ve 5 çocuk kategoriler var ve sadece tükürmek son 10 eklendi. Ben kategoriye göre bir sayı alabilirsiniz böylece sadece tüm dosyaları eklemek şu anda işlevleri var, ama ben sadece tarihe dayalı öğelerin belirli bir miktar görüntülemek için kodunu değiştirmek için görünmüyor olabilir.

Ben dosyaları listelemek için tüm bir kategoride dosyaları ve çocuklar saymak kullanıyorum kod güncellenmiştir. Asıl sorun benim bir SQL LIMIT ifadesini eklediğinizde, sadece bu kategoride değil, genel sorgu listelenir sonuçları kısıtlar.

Kod bu category_id ile indirme sorgulama her biri aracılığıyla döngüsü sonra bir dizideki tüm indirme kategorileri koyar.

Benim en iyi bahis bir dizi sonuçları koymak ve daha sonra oradan sıralamak olduğunu?

function list_cat_files($parent, $start) {

    global $menu_array;

    if($start == 1) {

        unset($GLOBALS["total"]);

        $query = mysql_query("SELECT * FROM download_categories");

        while ( $row = mysql_fetch_assoc($query) ) {

            $menu_array[$row['category_id']] =
              array(
                'name'        => $row['title'],
                'parent'      => $row['parent_id'],
                'category_id' => $row['category_id']);

        }
    }

    foreach($menu_array as $key => $value) {

        global $total;

        if ($value['parent'] == $parent) {

            $category_id = $value['category_id'];

            $query1 = mysql_query("SELECT lid AS id, title, date, category_id FROM downloads WHERE category_id='$category_id'");

            while($item = mysql_fetch_array($query1)) {

                $total .= "--- ($item[lid]) : $item[title] <BR><BR>";
            }

            list_cat_files($key, 0);
        }
    }
    return $total;
}

2 Cevap

Böyle bir şey yardım eder misiniz? $ Kategorileri varsayarsak istediğiniz kategori kimlikleri bir dizidir.

$query = FALSE;


foreach ($categories as $category){
    $query .= $query ? ' UNION ': '';

    $query .= "SELECT * from `downloads`
        WHERE category_id=$category order by date limit 10\n";

}

// run query here

Ben karmaşık kategori yapıları ile anlaşma ne zaman, yardımcı olursa, ben burada bu yaklaşım nasıl. Ben geliştirici olarak benim için kolay dışarı sıralama yapmak istiyorum gibi birçok sorguları yapmak. Performansı vida. Sonra gerektiği gibi çıktı önbelleğe ve kamu tüketimi için önbelleğe alınmış dosya kullanın. Kategoriler sık ​​sık değiştirmek istemiyorum, bu yüzden bir yönetici etrafında şeyler değişiyor zaman bu kaynak aç sorguları yalnızca vesilesiyle işletilmektedir, ve bir seferde sadece 1 kişi değil, ziyaret eden herkese daha.

select * from downloads where category_id=X order by date limit 10

Her kategori için tekrarlayın. İç içe bir dizi uygulamak istemiyorsan / modified preorder tree traversal (MPTT): http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/