Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Como hago esta consulta MYSQL desde PHP

Estas en el tema de Como hago esta consulta MYSQL desde PHP en el foro de Mysql en Foros del Web. Buenas tardes, no se como realizar la siguiente consulta a una base de datos mysql desde php, me ayudan? Necesito mostrar todos los registros de ...
  #1 (permalink)  
Antiguo 15/06/2012, 11:22
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Como hago esta consulta MYSQL desde PHP

Buenas tardes, no se como realizar la siguiente consulta a una base de datos mysql desde php, me ayudan?

Necesito mostrar todos los registros de una tabla, ordenados de tal forma, que los primeros registros a mostrar sean los que tienen relacion con otra tabla.

Seria asi:

TABLA NOTICIA:
idNoticia
texto

TABLA IMAGNENES
idIMagen
nombreDelArchivo

TABLA NOTICIA_X_IMAGENES
idNoticia
idImagen


Entonces, necesito sacar TODAS las imagenes de la tabla "IMAGENES", pero primero (en el listado que se genere) quiero ver las que tienen una relacion con el idNoticia en la tabla NOTICIA_X_IMAGENES.

Por supuesto, algunas imagenes no estan relacionadas en la tabla NOTICIA_X_IMAGENES

Gracias!!
  #2 (permalink)  
Antiguo 15/06/2012, 11:32
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Como hago esta consulta MYSQL desde PHP

Código MySQL:
Ver original
  1.     I.idIMagen,
  2.     I.nombreDelArchivo,
  3.     IFNULL(N.idNoticia, '') idNoticia,
  4.     IFNULL(N.texto, '') texto
  5. FROM IMAGNENES I
  6.     LEFT JOIN NOTICIA_X_IMAGENES TI ON TI.idIMagen = I.idIMagen
  7.     INNER JOIN NOTICIA N ON N.idNoticia = TI.idNoticia
El IFNULL() es para que no salga el NULL donde no haya coincidencias.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 15/06/2012, 11:45
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como hago esta consulta MYSQL desde PHP

Mil gracias, lo pruebo para ver si lo entiendo y vuelvo.
  #4 (permalink)  
Antiguo 15/06/2012, 11:57
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como hago esta consulta MYSQL desde PHP

Hola de nuevo, viendo tu codigo (mil gracias!) y probandolo, me di cuenta que no me explique bien. Y ensima puse unas tablas de ejemplo, por lo que complique mas las cosas, no queria molesta tanto, trato de aclararme mejor:

Tengo estas tablas:

TABLA: contenido
id

TABLA: imagenes
id

TABLA DE RELACION: contenido_x_imagenes
idContenido
idImagen

Una variable (trabajo en php): $id.
La variable $id contiene el ID de un elemento de la tabla contenido. (seria como el id de una noticia).

EL PROBLEMA:
Recuperar TODAS las imagenes de la tabla "imagenes", pero, ordenandolas de tal forma, que las imagenes que esten relacionadas con "$id" en la tabla de relaciones contenido_x_imagenes salgan primeras.

Mil gracias!
  #5 (permalink)  
Antiguo 15/06/2012, 14:34
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como hago esta consulta MYSQL desde PHP

Hola ebalmaceda:

¿Qué pasaría cuando una misma imagen esté incluida en más de un contenido?, es decir, supongamos que tienes la siguiente información en tus tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM contenido;
  2. +-------------+-------------+
  3. | idContenido | descripcion |
  4. +-------------+-------------+
  5. |           1 | Cont 1      |
  6. |           2 | Cont 2      |
  7. +-------------+-------------+
  8. 2 rows in set (0.00 sec)
  9.  
  10. mysql> SELECT * FROM imagenes;
  11. +----------+-------------+
  12. | idImagen | descripcion |
  13. +----------+-------------+
  14. |        1 | Img 1       |
  15. |        2 | Img 2       |
  16. |        3 | Img 3       |
  17. |        4 | Img 4       |
  18. +----------+-------------+
  19. 4 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT * FROM contenido_x_imagenes;
  22. +-------------+----------+
  23. | idContenido | idImagen |
  24. +-------------+----------+
  25. |           1 |        4 |
  26. |           1 |        1 |
  27. |           1 |        3 |
  28. |           1 |        2 |
  29. |           2 |        4 |
  30. +-------------+----------+
  31. 5 rows in set (0.00 sec)

Supongamos que tu variable de ambiente tenga el valor del contenido 2, según la tabla de relaciones la imagen 4 debería ser la primera en la lista, esto podrías hacerlo asi:

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

Observa en primer lugar que en el ORDER BY utilizo una condición IF para poner en primer lugar (1) aquellas foros que cuyo contenido sea igual a 2. todas las demás no me interesan y las dejo en segundo lugar (2). Sin embargo la imagen 4 aparece DOS VECES, ya que está relacionada tanto al contenido 1 como al dos... Si no quieres que esto suceda debes agregar una condición para filtrar estos casos.

Saludos
Leo.
  #6 (permalink)  
Antiguo 15/06/2012, 15:50
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como hago esta consulta MYSQL desde PHP

Hola Leo, muchas gracias por semjante explicacion.
Es cierto lo que comentas, una imagen puede estar en mas de un contenido, lo cual es necesario filtrarlo, como puedo hacerlo?

Pero hay algo mas importante aun, hay imagenes que NO estan vinculadas con ningun contenido, esas imagenes tambien quiero mostrarlas. Esto tampoco se hacerlo.

Disculpa las molestias, pero trabajo mucho con php y de mysql, solo se la sintaxis basica.
  #7 (permalink)  
Antiguo 15/06/2012, 21:23
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Información Respuesta: Como hago esta consulta MYSQL desde PHP

Buenas noches, luego de probar y probar con la ayuda que me brindaron deje el codigo asi:

Código PHP:
// cxi.idContenido lo uso para saber si esta en la tabla de relacion o no...
$cadenaMostrarIMG mysql_query("SELECT i.*, cxi.idContenido FROM imagenes i LEFT JOIN contenido_x_imagenes cxi ON i.id = cxi.idImagen ORDER BY IF (cxi.idContenido = 2, 1, 2)");  

 while(
$filaRecuperarIMG mysql_fetch_array($cadenaMostrarIMG))
 {

            
//Si hay idContenido, quiere decir que la imagen que estoy mostrando esta relacionada con el contenido (en este caso el contenido tiene ID=2)
            
if($filaRecuperarIMG['idContenido'] == 2)
            {
                
$checkbox 'checked="checked"';
            }
            else
            {
                
$checkbox '';
            }

            echo 
'<img src="../../upload/'.$filaRecuperarIMG['nombreArchivo'].'" align="left"/>';
            echo 
'<label><strong>ADJUNTAR</strong> <input type="checkbox" value="'.$filaRecuperarIMG['id'].'" name="imagenes[]" '.$checkbox.'  /></label>';

Es esto correcto? Funciona bien al menos.
Tengo el gran problema de que si una imagen aparece mas de una ves en la tabla de relaciones, se muestra duplicada en el listado. Como puedo hacer para que solo aparesca una ves?

Y no entiendo esta parte del codigo:

Código PHP:
ORDER BY IF (cxi.idContenido 212
Me explican?

Un saludo!
  #8 (permalink)  
Antiguo 18/06/2012, 08:37
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 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.
  #9 (permalink)  
Antiguo 18/06/2012, 10:53
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como hago esta consulta MYSQL desde PHP

Hola Leo!
Muchisimas gracias por la explicacion, estoy probando paso a paso todas las indicaciones y explicaciones del codigo que me sugeris para entenderlo.

No puse un ejemplo de lo que tenia hecho porque de sql, solo se insertar, editar y borrar, entonces no podia hacer mucho.

Igualmente, mientras iba recibiendo respuestas en el foro, seguí investigando por mi cuenta y logre esta sentencia:


Código:
SELECT i.id, i.nombreArchivo, cxi.idContenido, cxi.titulo, cxi.descripcion, cxi.posicion FROM imagenes i LEFT JOIN contenido_x_imagenes cxi ON i.id = cxi.idImagen GROUP BY(i.id)  ORDER BY IF (cxi.idContenido = 2, 1, 2)"
Que en lo que la probe, funciona correctamente, es mucha molestia pedirte que me des tu opinion, para saber si es malo usarla o en que me confundi, para seguir aprendiendo.

Ahora mismo estoy probando tu codigo y en un rato posteo las dudas.

Mil disculpas por postear el codigo php, lo puse solo para que se entendiera que trataba de hacer.

Y, solo una curiosidad, como haces para que en tus ejemplos, cuandos posteas quede todo tan prolijo? Con las tablas y demas, usas un programa externo?

Mil gracias!!
  #10 (permalink)  
Antiguo 18/06/2012, 11:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Como hago esta consulta MYSQL desde PHP

Hola de nuevo ebalmaceda:

Hay que tener cuidado en cómo utilizar la cláusula GROUP BY... si bien, para este caso, pudiera darte los resultados que esperas, esto puede también traer problemas.

La cláusula GROUP BY, debe utilizarse siempre que utilices alguna función de agrupación (COUNT, MAX, MIN, AVG, etc.) pero no es correcto que la utilices para filtrar información, su función, como su nombre lo indica es AGRUPAR registros que tengan criterios semejantes pero de ninguna manera filtra información... Para filtrar información puedes hacerla en la sección WHERE, en la sección ON (como pongo en el ejemplo) o en la sección HAVING (que se utiliza en conjunto con la cláusula GROUP BY).

En cuanto al formato de los mensajes, sólo es cuestión de utilizar las herramientas de edición que aparecen en la parte superior del editor... no es ningún programa externo... las consultas las hago directamente en el modo comando de MySQL y utilizo el editor para darle formato... al igual que la etiqueta [ CODE ] [ /CODE ] que utilizas dando clic en el "#", utiliza el combo que dice "Highligth" para especificar que son consultas de mysql. Lo demás es simplemente un estándar que sigo para las consultas (y que algunos editores como SQLyog también implementan), como por ejemplo poner las palabras reservadas en mayúsculas, poner en renglones distintos las secciones SELECT, FROM, WHERE, etc... manejar sangrías y cosas por el estilo, es decir tratar de ser ordenado con lo que se programa...

Un profesor me dijo alguna vez que cuando un programador no da formato a sus códigos, solo el programador y Dios lo entienden... pero un mes después de programado, Sólo Dios lo entiende, pues ni el mismo programador recuerda qué es lo que hizo.

Saludos
Leo.

Última edición por leonardo_josue; 18/06/2012 a las 11:47
  #11 (permalink)  
Antiguo 20/06/2012, 13:47
 
Fecha de Ingreso: noviembre-2007
Mensajes: 191
Antigüedad: 16 años, 5 meses
Puntos: 0
Respuesta: Como hago esta consulta MYSQL desde PHP

hola!
Paso solamente a agredecer la gran ayuda brindada, aprendi mucho en este post y ademas, pude modificar la sentencia para solucionar otro problema que tenia.

Mil gracias a todos!
En especial a leo!

Etiquetas: php, registros, sql, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:35.