Ver Mensaje Individual
  #8 (permalink)  
Antiguo 18/06/2012, 08:37
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 meses
Puntos: 447
Respuesta: Como hago esta consulta MYSQL desde PHP

Hola ebalmaceda:

Antes que nada una petición, por favor, cuando postees en este foro SOLO PUBLICA CÓDIGO SQL, NO MEZCLES LENGUAJES DE PROGRAMACIÓN. Existe un foro dedicado exclusivamente para PHP donde puedes postear el código que quieras, pero por políticas del foro aquí sólo debes colocar código SQL. Ojo para la próxima.

Ahora sí, vayamos por partes para aclarar tus dudas:

Cita:
hay imagenes que NO estan vinculadas con ningun contenido,
Esto no tiene que preocuparte, al utilizar LEFT JOIN se mostrarán todas las imágenes, independientemente si si están ligadas a algún contenido o no...


Cita:
Y no entiendo esta parte del codigo:

ORDER BY IF (cxi.idContenido = 2, 1, 2)
Esto sirve solamente para clasificar cada imagen y determinar si se debe colocar al inicio (si es que pertenece al contenido) o al final... Observa cuál es el resultado de la consulta ponemos el IF en la parte del select:

Código MySQL:
Ver original
  1. mysql> SELECT
  2.     ->   cxi.*,
  3.     ->   IF (cxi.idContenido = 2, 1, 2) campo_if
  4.     -> FROM contenido_x_imagenes cxi
  5.     -> ORDER BY campo_if;
  6. +-------------+----------+----------+
  7. | idContenido | idImagen | campo_if |
  8. +-------------+----------+----------+
  9. |           2 |        4 |        1 |
  10. |           1 |        4 |        2 |
  11. |           1 |        1 |        2 |
  12. |           1 |        3 |        2 |
  13. |           1 |        2 |        2 |
  14. +-------------+----------+----------+
  15. 5 rows in set (0.00 sec)

Observa la columna campo_if, sólo cuando el idContenido es 2 se le coloca un 1 en la columna, para el resto se coloca el 2. al hacer
Código:
ORDER BY campo_if
es lo mismo a hacerlo como
Código:
ORDER BY IF (cxi.idContenido = 2, 1, 2)
Cita:
una imagen puede estar en mas de un contenido, lo cual es necesario filtrarlo, como puedo hacerlo?
El filtrado de estas imágenes puedes hacerlo de muchas maneras, me hubiera gustado que al menos hubieras hecho algún intento y nos mostraras qué es lo que intentaste hacer... ojo también para la próxima. Checa este script:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM imagenes;
  2. +----------+-------------+
  3. | idImagen | descripcion |
  4. +----------+-------------+
  5. |        1 | Img 1       |
  6. |        2 | Img 2       |
  7. |        3 | Img 3       |
  8. |        4 | Img 4       |
  9. |        5 | Img 5       |
  10. +----------+-------------+
  11. 5 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM contenido_x_imagenes;
  14. +-------------+----------+
  15. | idContenido | idImagen |
  16. +-------------+----------+
  17. |           1 |        4 |
  18. |           1 |        1 |
  19. |           1 |        3 |
  20. |           1 |        2 |
  21. |           2 |        4 |
  22. +-------------+----------+
  23. 5 rows in set (0.01 sec)
  24.  
  25.  
  26. mysql> SELECT
  27.     ->   i.*,
  28.     ->   cxi.*,
  29.     ->   IF (cxi.idContenido = 2, 1, 2) campo_if
  30.     -> FROM imagenes i
  31.     ->   LEFT JOIN contenido_x_imagenes cxi
  32.     ->     ON i.idImagen = cxi.idImagen
  33.     ->       AND (cxi.idImagen NOT IN(SELECT
  34.     ->                                  idImagen
  35.     ->                                FROM contenido_x_imagenes cxi2
  36.     ->                                WHERE cxi2.idContenido = 2)
  37.     ->             OR cxi.idContenido = 2)
  38.     -> ORDER BY campo_if;
  39. +----------+-------------+-------------+----------+----------+
  40. | idImagen | descripcion | idContenido | idImagen | campo_if |
  41. +----------+-------------+-------------+----------+----------+
  42. |        4 | Img 4       |           2 |        4 |        1 |
  43. |        5 | Img 5       |        NULL |     NULL |        2 |
  44. |        1 | Img 1       |           1 |        1 |        2 |
  45. |        2 | Img 2       |           1 |        2 |        2 |
  46. |        3 | Img 3       |           1 |        3 |        2 |
  47. +----------+-------------+-------------+----------+----------+
  48. 5 rows in set (0.00 sec)

Básicamente es el mismo ejemplo que el que puso al inicio, pero ahora existe una imagen 5 que no está asociada a ningún contenido. Observa que la imagen 4, que esta asociada a dos contenidos diferentes YA NO APARECE DUPLICADA, solo aparece una vez y aparece en el primer lugar. la parte del filtrado la hago en esta sección:

Código:
LEFT JOIN contenido_x_imagenes cxi
    ON i.idImagen = cxi.idImagen
      AND (cxi.idImagen NOT IN(SELECT
                                 idImagen
                               FROM contenido_x_imagenes cxi2
                               WHERE cxi2.idContenido = 2)
            OR cxi.idContenido = 2) 
Observa que hago una subconsulta para obtener todas las imagenes que están asociadas al contenido 2:

Código MySQL:
Ver original
  1. mysql> SELECT idImagen FROM contenido_x_imagenes cxi2
  2.     -> WHERE cxi2.idContenido = 2;
  3. +----------+
  4. | idImagen |
  5. +----------+
  6. |        4 |
  7. +----------+
  8. 1 row in set (0.00 sec)

Utilizando esto y la condición OR cxi.idContenido = 2 le indico a la consulta que la Imagen 4 SÓLO SE VA A MOSTRAR PARA EL CONTENIDO 2, para cualquier otro contenido NO SE MUESTRA.

Observa finalmente que la imagen 5 también se muestra en el listado, pero tiene NULL en algunos campos, esto debido a que no está asociada a ningún contenido.

Dale un vistazo y si continuas con dudas lo comentas en el foro.

Saludos
Leo.