2014-09-30 1 views
0

я получил два SQL-таблицы:Получить категории и статьи с помощью одного запроса

  1. категории: идентификатор, название, уровень, родительскую
  2. статьи: идентификатор, название, 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

+0

Что выход вы хотите? –

+1

@JayBlanchard Желаю славы и удачи! – Charles

+0

Просто нужен результат, показанный выше. Это означает названия категорий и заголовков статьи ... – user3142695

ответ

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 

Это дает вам все статьи, включая первичную категорию и (по желанию) родительской категории Но вы должны учитывать, что Categor 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 является основной. Следующая проверка строки - родительский P - NULL. Если да, то нет подкатегории; если нет, то категория C является подкатегорией. Выглядит немного неудобным, но для двух уровней она отлично работает:

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