2011-05-20 15 views
5

Estoy tratando de aprender MySQL, así que he creado un pequeño sistema de blog.MySQL: Obtener publicaciones de categorías

Tengo 3 tablas en 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 

Cada puesto puede tener varias categorías, su relación se almacena en post_category_relations:?

Así que cuando vuelva a index.php categoría = 10, me gustaría obtener cada puesto lo que se relaciona con category10 incluyendo los mensajes de su carpeta secundaria category12 también.

Mi inacabada de fragmentos en 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); 

Sé que esto requerirá conocimientos avanzados de MySQL, pero cualquier ayuda se agradece! Ya hice esto en PHP, pero necesito usar 4 loops, que no es la mejor manera de hacerlo cuando es posible en MySQL, aún no sé cómo :)

+1

en primer lugar si debe escapar de su entrada get antes de hacer una consulta (para evitar inyecciones de SQL) esto: $ folder_id = $ _GET ["category"]; debería ser: $ folder_id = mysql_real_escape_string (stripslashes ($ _ GET ["category"])); – Tim

+0

También sugiero que lea los artículos proporcionados @Denis. Aprenderás mucho :) Yo mismo leo eso varias veces. – Rifat

+0

Usar variables de sesión de MySQL: http://explainextended.com/2009/09/29/adjacency-list-vs-nested-sets-mysql/. También vea esta pregunta para otras opciones: http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database – orangepips

Respuesta

0

No estoy en posición de prueba mi consulta, pero creo que algo así como

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=?) 

es lo que estás buscando.

+0

Solo funcionará para una sola profundidad – Rifat

+0

@Rifat y ¿en qué parte de la pregunta se menciona que las categorías no están en un árbol de una sola profundidad? Citando: "Entonces, cuando visite index.php? Category = 10, me gustaría obtener cada publicación relacionada con la categoría 10, incluidas las publicaciones de su categoría de carpeta secundaria12 también". – amal

+0

la estructura de la tabla en sí es para multinivel ¿no? – Rifat

4

Es probable que encuentres estos artículos de Phillip Keller interesante:

Cubren las etiquetas, pero sus consultas (es decir category1 and category2 vs category1 or category2, y el que usted estamos tratando de escribir) será casi idéntico.

Consulte también esta discusión sobre la indexación de datos jerárquicos: Managing Hierarchical Data in MySQL.

Además de la multitud de hilos en la relacionada con SO conjuntos anidados, etiquetas, categorías, etc.

+0

etiquetas no se pueden utilizar en este caso, solo árbol (con rutas, supongo). Entonces +1 para el enlace jerárquico, pero podría escribir una respuesta más detallada. –

+1

Sí, pensé. Sin embargo, las consultas de varias categorías serán muy similares, ya sean etiquetas o categorías: su tabla post2cat se dividirá en la tabla post2tag que se analiza en el artículo. –

0

Este es uno de 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

Solo funcionará para una sola profundidad – Rifat

Cuestiones relacionadas