2014-09-30 33 views
0

我有兩個SQL-表:獲取類別和物品使用單個查詢

  1. 類:身份證,職稱,級別,父
  2. 文章:ID,標題,CATEGORY_ID

現在我要得到這樣的結果:

Category 1 
    Article 1 
    Artcile 2 
    Article 3 
Category 2 
    Subcategory 1 
     Article 1 
     Artcile 2 
     Article 3 
    Subcategory 2 
     Article 1 
     Artcile 2 
     Article 3 
Category 3 
    Article 1 
    Artcile 2 
    Article 3 

我會做這種方式:

$categories = $db->prepare('SELECT * FROM categories WHERE level = 0'); 
$categories->execute(); 
while($category = $categories->fetch(PDO::FETCH_OBJ)) { 
    $sub_categories = $db->prepare('SELECT * FROM categories WHERE parent = :parent_id'); 
    $sub_categories->bindParam(':parent_id', $category->id, PDO::PARAM_INT); 
    $sub_categories->execute(); 
    while($sub_category = $sub_categories->fetch(PDO::FETCH_OBJ)) { 
     $articles = $db->prepare('SELECT * FROM articles WHERE category_id = :category_id'); 
     $articles->bindParam(':category_id', $sub_category->id, PDO::PARAM_INT); 
     $articles->execute(); 
     while($article = $articles->fetch(PDO::FETCH_OBJ)) { 
      echo $article->title.'<br />'; 
     } 
    } 

} 

首先,這是非常糟糕的,因爲它只是從子類別(而不是類別)獲取文章,並且只選擇了一個深度級別。

第二:我使用三個querys,這是執行多次,只是爲了這個基本的東西。性能... :-(

我想解決這個問題只有一個SQL查詢這可能 (然後我會創造的產值......)

SQLfiddle:?http://sqlfiddle.com/#!2/2a4f2

+0

什麼輸出你的願望? – 2014-09-30 20:47:03

+1

@JayBlanchard我渴望成名和財富! – Charles 2014-09-30 20:52:47

+0

只需要上面顯示的結果。這意味着文章的標題類別和標題... – user3142695 2014-09-30 20:53:50

回答

0

你可以試試這個說法:

SELECT 
    A.id, A.title, 
    C.id AS category_id, C.title AS category_title, C.level AS category_level, 
    P.id AS parent_id, P.title AS parent_title, P.level AS parent_level 
FROM articles AS A 
    INNER JOIN categories AS C ON A.category_id=C.id 
    LEFT JOIN categories AS P ON C.parent=P.id 

這給你,包括主類別和(可選)父類的所有文章,但你必須要考慮,即範疇上y可以是主要或子類別。

您可以通過這種方式進行更改,以便始終直接獲取主類別和子類別並對其進行排序。

SELECT 
    IFNULL(P.id, C.id) AS category_id, IFNULL(P.title, C.title) AS category_title, 
    IF(P.id IS NULL, NULL, C.id) AS subcategory_id, IF(P.title IS NULL, NULL, C.title) AS subcategory_title, 
    A.id, A.title 
FROM articles AS A 
    INNER JOIN categories AS C ON A.category_id=C.id 
    LEFT JOIN categories AS P ON C.parent=P.id 
ORDER BY category_id, subcategory_id, A.id 

IFNULL看起來是否有父類別。如果是,則父母P是主要類別;如果不是,則以C爲主。下一行檢查是父母PNULL。如果是,則沒有子類別;如果不是,類別C是子類別。看起來有點不方便,但對於兩個層次,它工作正常:

http://sqlfiddle.com/#!2/0ed4d/4

相關問題