MySQL: получение сообщений из категорий - PullRequest
5 голосов
/ 20 мая 2011

Я пытаюсь изучить MySQL, поэтому создал небольшую систему блогов.

У меня есть 3 таблицы в MySQL:

posts:

id    |  title      
----------------
1     |  Post Title 1         
2     |  Post Title 2  

categories:

id    |  title          | parent
--------------------------------
10     |  category10    | 0 
11     |  category11    | 0
12     |  category12    | 10 

post_category_relations:

id    |  post_id   |   category_id
----------------------------------
1     |  1         |   10
2     |  2         |   12
3     |  3         |   11

Каждый пост может иметь несколько категорий, их отношение хранится в post_category_relations:

Поэтому, когда я захожу на index.php? Category = 10, я хотел бы получить каждый пост, связанный с category10, включая посты из дочерней папки category12.

Мой незаконченный фрагмент в PHP

$folder_id = $_GET["category"]; // Get Category ID from the URL
$sql = "SELECT * FROM posts 
          JOIN categories
          JOIN post_category_relations
        // And I don't really know what should I do here
        // because I need the child categories first, then the relations
        // then I can get the post too from the post_id of the relations
       ";
mysql_query($sql);

Я знаю, что для этого потребуются продвинутые навыки работы с MySQL, но любая помощь приветствуется!Я уже сделал это в PHP, но мне нужно использовать 4 цикла, что не лучший способ сделать это, когда это возможно в MySQL, я просто пока не знаю, как:)

Ответы [ 3 ]

4 голосов
/ 20 мая 2011

Вы, вероятно, найдете эти статьи Филиппа Келлера интересными:

Они охватывают теги, но ваши запросы (т. Е. category1 and category2 против category1 or category2 и тот, который вы пытаетесь написать) будут почти идентичны.

См. Такжеобсуждение индексации иерархических данных: Управление иерархическими данными в MySQL .

, а также множество потоков в SO, связанных с вложенными наборами, тегами, категориями и т. д.

0 голосов
/ 20 мая 2011

Это один SQL:

 # Take post from castegory $cat_id
    (SELECT P.* 
        FROM 
          posts P, post_category_relations PR 
    WHERE 
       PR.category_id = {$cat_id} AND PR.post_id = P.id
     )
    UNION
    # Take all post from $cat_id child categories
    (SELECT P.* 
        FROM 
          posts P, post_category_relations PR, categories C
    WHERE 
       PR.category_id = C.parent AND PR.post_id = P.id 
       AND C.id = {$cat_id}
     )
0 голосов
/ 20 мая 2011

Я не в состоянии проверить свой запрос, но я считаю, что что-то вроде

select * from posts,post_category_relations where post.id=post_category_relations.post_id and
post_category_relations.category_id in (select id from categories where id=? or parent=?)

- это то, что вы ищете.

...