簡體   English   中英

單個查詢即可獲取類別和文章

[英]Get categories and articles with a single query

我有兩個SQL表:

  1. 類別:ID,標題,級別,父級
  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 />';
        }
    }

}

首先,這很不好,因為它只是從子類別(而不是類別)中獲取文章,而且只能選擇一個級別的內容。

第二:我正在使用三個查詢,這些查詢多次執行,僅用於基本操作。 性能... :-(

我只想用一個SQL查詢來解決這個問題。 這可能嗎? (然后我將創建輸出...)

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

您可以嘗試以下語句:

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

這為您提供了所有文章,包括主要類別和(可選)父類別。 但您必須考慮,該類別可以是主類別或子類別。

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

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為主要類別;否則,為P 如果不是,則類別C是主要類別。 下一行檢查的是父級P是否為NULL 如果是,則沒有子類別; 如果否,則類別C是子類別。 看起來有點不方便,但在兩個級別上都可以正常工作:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM