Alt MySQL ve PHP

5 Cevap php

Ben alt kategorileri ile sorun yaşıyorum.

Ben 1 sql sorgusu ile sayfamda bu görüntülemek istiyorsanız:

  • Category 1:
    • Alt cat 1
    • Sub kedi 2
    • ...
    • Alt kedi n
  • Category 2:
    • Alt cat 1
    • Sub kedi 2
    • ...
    • Alt kedi n
  • Category 3:
    • Alt cat 1
    • Sub kedi 2
    • ...
    • Alt kedi n
  • ...

Tablo şema:

  • categories
    • id | catname | açıklama
  • subcategory
    • id | parent_id | catname | açıklama

Şu anda kategoriler için bir sorgu kullanarak ve kulüpler PHP döngü başka alt için sorgu, ama bu bana bir sayfada çok fazla sorgu verirken

5 Cevap

Tüm kategoriler ve tüm alt almalısınız. Böyle bir şey:

$sql = '
    SELECT * FROM categories ORDER BY id ASC
';
$result = mysql_query($sql);

$categories = array();

while ($row = mysql_fetch_array($result)) {
    $categories[$row['id']] = $row;
}

// get the subcategories
$sql = '
    SELECT * FROM subcategories ORDER BY id ASC
';
$result = mysql_query($sql);

while ($row = mysql_fetch_array($result)) {
    $categories[$row['parent_id']]['subcategories'][] = $row;
}

print_r($categories);

Bu size PHP istersen yapabilirsin güzel bir dizi yapısında onları koymak istiyorum. Ve sadece iki sorgularının.

Ağaç yapıları için iki tablo için herhangi bir ihtiyaç asla, standart bir ağaç-ing tablo şema olabilir:

categories
id | catname | description | parent | lineage

Lineage geri kök kategori örneğin yolunu içerecektir '0, 2,5,6 ', ana içerecektir 6

Sonra soru için size UZUNLUĞU (soy) ASC BY, bu tablo ORDER tüm seçebilirsiniz

Eğer kendi kimliği ile db size endeksi onları sizin resultset aldıktan sonra,

$categories = array();
while($row = mysql_fetch_assoc($result)){
   $categories[$row['id']] = $row;
}

Şimdi bunlar aracılığıyla döngü sizin html geçerli kategori herhangi bir alt kategorisi olup olmadığını görmek için kontrol edebilirsiniz zaman.

Lineage belirli bir kategoride torunlarıdır tüm kategorileri bulmak için kullanılır:

SELECT * FROM categories WHERE lineage REGEXP '[[:<:]]5[[:>:]]'

Bu onların soy 5 ile herhangi kategorileri alırsınız.

Biz uygun bir eleştirisini sunmak için tablo şemasını görmek gerekir, ama ne yapabilirdi kategori, alt kategori göre sıralanmış tek bir sorguda, içinde kategorilere alt kategoriler join ediyorum. Eğer yeni bir kategori gördüğünüzde, bunu mevcut alt kategori listesini bitirmek ve yeni bir kategori başlatmak için zamanı biliyorum.

Tabloları görmeden, muhtemelen gibi bir şey gerekir:

SELECT category.name, subcategory.name
FROM categories
LEFT JOIN subcategory
  ON subcategory.category_id = category.id
ORDER BY category.name, subcategory.name

Zed cevap benzer, ancak tablo alt kategori seçerek ve ardından kategorileri katılmadan:

SELECT categories.name, subcategory.name
FROM subcategory
JOIN categories
  ON category.id = subcategory.category_id
ORDER BY category.id, subcategory.id

Bu (kategori 1, alt kedi 1), (kategori 1, alt kedi 2) gibi değerleri çiftleri dönecektir ... ayrıca sütunları için tablosuna eklemek ve zaman gibi uygun adlar yapmak

SELECT categories.name AS maincat_name, 
    subcategory.name AS subcat_name, subcategory.id AS subcat_id