Ver Mensaje Individual
  #14 (permalink)  
Antiguo 20/01/2013, 05:45
Avatar de gnzsoloyo
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, 6 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
Iniciado por dashtrash Ver Mensaje
Consulta equivalente a la tuya, que aprovecha más la potencia y capacidades:
Código MySQL:
Ver original
  1. FROM principal P
  2.     LEFT JOIN videos V ON P.id = V.id_principal
  3.     LEFT JOIN fotos F ON P.id = F.id_principal
No hace falta ni agrupación de filas , ni de columnas.
Al fin y al cabo, si le vas a pasar al código la responsabilidad de saber qué son videos, y qué son fotos, al menos, que tenga todos los campos.
Si te fijas con mas cuidado, yo ya había planteado esa sentencia como una posibilidad, pero puse la advertencia de que esa sintaxis producirá un producto cartesiano.
Supongo que sabes a qué me refiero con "producto cartesiano".
En cualquier caso no es una "posibilidad", de ocurrencia, sino una certeza, porque la experiencia me lo ha demostrado: genera ese problema.
La explicación de por qué ya se la he dado a varios foristas en otra ocasión cuando preguntaban por qué se les producia ese tipo de respuestas.

Cita:
Iniciado por dashtrash Ver Mensaje
Cambiar los NULL por '', o por agrupaciones de algo que no viene duplicado...No sé cómo aprovecha la potencia.
Los NULL son potentes en las bases de datos, aunque difíciles de entender para los programadores. Y de todos modos no es el tema base: La idea de la función IFNULL() que prevnir algo que sin datos de la base original no puedo comprobar, además de ser una escritura habitual en los DBA en los LEFT JOIN para evitar que el programador tenga problemas con los resultado.
Inevitable para mi, porque trabajo profesionalmente como DBA. Tengo ciertos hábitos de codificación adquiridos.
La función GROUP_CONCAT() tiene por objetivo evitar las repeticiones de la primera columna, y recolectar todos los IDs de las otras dos relacionados al mismo ID, especialmente en el caso de que no haya una relación 1:1 entre fotos y videos (que es lo que el forista dice, precisamente).
Cita:
Iniciado por dashtrash Ver Mensaje
Por favor, ejecuta esto en tu Mysql, a ver si te da algún error:
Código MySQL:
Ver original
  1. select * from (select 2 as a) a1, (select 3 as a) a2;
Son 2 tablas con una columna con el mismo nombre.
Si te fijas, la descripcion de las tablas es:
Cita:
PRINCIPAL: id, visitas, titulo, descripcion, vista_previa, tipo, fecha
VIDEOS: id, id_principal, codigo_video
FOTOS: id, id_principal, nombre_foto
COmo se puede apreciar, cada tabla tiene su propio campo "ID", por lo que un "SELECT *" hecho sobre dos tablas devolverá ambas columnas con ese mismo nombre.
Esto no genera problema al momento de una consulta simple como:
Código MySQL:
Ver original
  1. FROM principal P LEFT JOIN fotos F ON P.id = F.principal_ID
Pero cuando transformas esa consulta en una tabla derivada con la sintaxis:
Código MySQL:
Ver original
  1.     (SELECT *
  2.     FROM principal P LEFT JOIN fotos F ON P.id = F.principal_ID) tabla1
  3. WHERE ...
Tendrás en algun momento problemas con esos dos campos si usases esos campos como condición.

TE concedo que me distraje un momento con los nombres, y que si haces exactamente con las tablas descritas una consulta a dos tablas, no se producirá problema de ambigüedad de columnas. Pero los tendrás luego al leer el resultado en PHP, y también si haces la consulta a tres tablas, donde si se generaría... Aunque evitarlo es sencillo: Basta con poner alias a la columna de la subconsulta.

Finalmente, creo que deberíamos esperar la respuesta del forista, porque esto se está convirtiendo en un debate entre dos, y ninguno tiene toda la información necesaria para solucionar el problema completamente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)