2011-09-28 50 views
5

Estoy desarrollando un sitio donde las personas pueden publicar sus casas en alquiler. Estoy usando PHP 5.2.0 y MySQL 5+Cómo unir varias tablas relacionadas por otras tablas

las publicaciones se almacenan en una tabla como ésta

ta_publications 
+---+-------------+------+ 
|id | name  | date | 
+---+-------------+------+ 
| 1 | name_001 | ... | 
| 2 | name_002 | ... | 
| 3 | name_003 | ... | 
+---+-------------+------+ 

tengo diferentes publicaciones, que tienen "características" como "Internet", "hecho service "," satellite tv ", etc.

Estas características pueden cambiar en el futuro, y quiero poder agregarlas/eliminarlas/modificarlas, así que las almaceno en la base de datos en una tabla.

ta_features 
+---+-------------+ 
|id | name  | 
+---+-------------+ 
| 1 | Internet | 
| 2 | Wi-Fi  | 
| 3 | satelital tv| 
+---+-------------+ 

que están relacionados con las publicaciones utilizando la siguiente tabla

ta_publication_features 
+---+-------------+----------------+ 
|id | type_id | publication_id | 
+---+-------------+----------------+ 
| 1 |  1  |  1  | 
| 2 |  2  |  1  | 
| 3 |  3  |  1  | 
+---+-------------+----------------+ 

Creo que es bastante fácil de entender; Hay una publicación llamada name_001 que tiene Internet, wi-fi y televisión satelital.

Tengo la misma técnica de esquema para las imágenes, les almacenar en esta tabla

ta_images 
+---+-------------+ 
|id | src   | 
+---+-------------+ 
| 1 | URL_1  | 
| 2 | URL_2  | 
| 3 | URL_3  | 
+---+-------------+ 

Y el uso de la siguiente tabla para relacionarlos con las publicaciones

ta_publication_images 
+---+-------------+----------------+----------+ 
|id | img_id  | publication_id | order | 
+---+-------------+----------------+----------+ 
| 1 |  1  |  1  | 0  | 
| 2 |  2  |  1  | 1  | 
| 3 |  3  |  1  | 2  | 
+---+-------------+----------------+----------+ 

el orden de columnas da el orden en el que las publicaciones deben mostrarse al enumerar una publicación única.

Philipp Reichart me proporcionó una consulta que buscará y obtendrá todas las publicaciones que tienen ciertas características. Funciona para enumerar las publicaciones, no puedo modificarlo para devolverme los datos que necesito.

Así que pensé que iba a ejecutar esa consulta y obtener todas las publicaciones que pasan los criterios de búsqueda y luego utilizar otra consulta para enumerarlas.

La lista de estas publicaciones debe incluir todos los datos de publicación (todo en ta_publications) + todas sus características + la más importante (orden 0) src de imagen.

Podría, para cada publicación, tener dos consultas simples que devolverán, por separado, la imagen más importante y todas las características que tiene, pero al listar 25 publicaciones por página, será 1 consulta de búsqueda + (2 querys por publicación * 25 publicaciones) = 51 consultas diferentes, claramente no muy eficientes.

EDIT:

Mi pregunta es, ¿cómo puedo crear una consulta SQL que, teniendo en cuenta algunos identificadores de publicación, volverá: todos los datos de publicación (todo en ta_publications) + todas sus características + el más importante (de orden 0) imagen src

+0

pregunta bien escrita ya que eres tan nuevo. :) + vote – Layke

+0

No ha hecho una pregunta. Muestra lo que estás tratando de lograr. –

+0

¿Entonces está solicitando una consulta que devuelva todas las publicaciones, por identificación, incluidas sus características y la imagen superior? –

Respuesta

1

Usted obtendrá datos de publicación y de imagen redundantes con éste, pero aquí hay una manera de hacerlo con una sola consulta:

SELECT p.id, p.name, p.date, 
      f.id, f.name, 
      i.id, i.src 
    FROM ta_publications p 
    JOIN ta_publication_features pf ON p.id = pf.publication_id 
    JOIN ta_features f ON f.id = pf.type_id 
    JOIN ta_publication_images pi ON p.id = pi.publication_id 
     AND pi.order = 0 
    JOIN ta_images i ON i.id = pi.img_id 
    WHERE p.id IN ( -- list of publication ids); 
+0

funciona pero proporciona datos redundantes, como usted dijo. ¿Hay alguna manera de evitar obtener estos datos redundantes? – Daniel

+0

No hay forma de evitarlo, dada la naturaleza de la relación. –

+0

Y lo que es mejor, en términos de rendimiento, use la consulta de búsqueda para obtener los posibles ID y luego use su consulta para obtener la información del listado, elimine la redundancia con PHP o utilice la consulta de búsqueda y luego para cada publicación, haga 1 consulta para obtener el IMG y una segunda consulta para obtener una lista de todas las características? Esta segunda opción es mucho más simple y predecible, pero utiliza muchas consultas. Creo que será más fácil paginar con la segunda opción. ¿Qué piensas? – Daniel

1
Select pub.Name as [Publication], f.name as [Feature], i.name as [Image] from ta_publications pub 
Join ta_publications_features pf on pf.publication_id = pub.id 
Join ta_features f on f.id = pf.type_id 
Join ta_publication_images pi on pi.publication_id = pub.id 
Join ta_images i on i.id = pi.img_id 
Where pub.id = 'appropriate id' 
order by i.[order] 

Si he seguido su estructura correctamente esto debe darle las uniones que necesita. y puede agregar las columnas deseadas al resultado en la declaración de selección al agregar ... Espero que esto ayude.

+0

puede tomar out (Donde pub.id = 'identificación apropiada') si quieres todas las publicaciones y como quieres que la img superior simplemente reemplace la orden por (donde i.order = 0) –

+0

para una publicación con 6 funciones y 3 imágenes, me arroja 18 filas. Para cada foto, da 6 filas, cada una con una característica diferente. – Daniel

+0

agregar el orden pi.order = 0 ayuda un poco al problema, ahora devuelve una fila para cada característica. – Daniel