Foros del Web » Programando para Internet » PHP »

Mostrar resultados mysql en 2 columnas distintas

Estas en el tema de Mostrar resultados mysql en 2 columnas distintas en el foro de PHP en Foros del Web. Hola a todos, Intento extraer los datos de mysql y mostrarlos en dos columnas distintas pero sin éxito. Os explico... Actualmente en la base de ...
  #1 (permalink)  
Antiguo 18/01/2013, 18:20
 
Fecha de Ingreso: enero-2007
Mensajes: 158
Antigüedad: 17 años, 3 meses
Puntos: 2
Pregunta Mostrar resultados mysql en 2 columnas distintas

Hola a todos,
Intento extraer los datos de mysql y mostrarlos en dos columnas distintas pero sin éxito.
Os explico... Actualmente en la base de datos guardo registros en una tabla llamada "principal". En esta tabla guardo tanto videos como fotos, pero todos tienen la misma estructura de tabla, es decir, en todos guardo: id, titulo, descripcion.
Lo que no consigo hacer es mostrar estos datos divididos en 2 columnas distintas, una para las fotos y otra para los videos.
Sería interesante hacerlo todo desde una misma consulta a mysql para así poder hacer una sola paginación de resultados.

La idea sería esta por ejemplo:
Columna1 | Columna2
Foto id 1 | Video id 3
Foto id 2 | Video id 5
Foto id 4 | Video id 6
... | ...

[PAGINACION]

A ver si alguno de vosotros me puede ayudar ;)
Gracias de antemano!!
  #2 (permalink)  
Antiguo 18/01/2013, 18:33
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, 5 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
Actualmente en la base de datos guardo registros en una tabla llamada "principal". En esta tabla guardo tanto videos como fotos, pero todos tienen la misma estructura de tabla, es decir, en todos guardo: id, titulo, descripcion.
O sea que guardas caballos y manzanas en la misma tabla...
Que algo parezca ser lo mismo no significa que sea lo mismo, ni aunque tenga los mismos atributos (que por otra parte no los tienen, una foto tiene dimensiones, mientras que un video tiene duración en tiempo, lo que significa que no son exactamente lo mismo).
Cita:
pero todos tienen la misma estructura de tabla, es decir, en todos guardo: id, titulo, descripcion.
Lo que no consigo hacer es mostrar estos datos divididos en 2 columnas distintas, una para las fotos y otra para los videos.
Bueno, si tienen exactamente la misma estructura, y no puedes diferenciar uno de otro... es difícil que puedas hacer una consulta que las diferencie.
Es muy probable que antes debas depurar esos datos y cambiar la estructura de tablas para que sirva para hacer esa diferenciación.
__________________
¿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 18/01/2013, 18:51
 
Fecha de Ingreso: enero-2007
Mensajes: 158
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Hola de nuevo...

Tienes toda la razón, voy a explicarme mejor:

En la tabla de datos principal, guardo los títulos, descripciones y demás de las fotos y los vídeos.
Después tengo una tabla llamada videos donde incluyo el resto de datos del video, como por ejemplo el código embed de un vídeo de youtube.
También tengo una tabla llamada fotos, donde guardo el id de la galería (por si hay varias fotos en la misma galería) y el nombre de cada foto para luego poder mostrarla...

En definitiva tengo:
PRINCIPAL: id, visitas, titulo, descripcion, vista_previa, tipo, fecha
-----> el "tipo" puede ser 1 para videos o 2 para fotos
VIDEOS: id, id_principal, codigo_video
FOTOS: id, id_principal, nombre_foto

Yo los datos que muestro en la index de mi página, son los datos que tengo almacenados en la tabla PRINCIPAL, pero me gustaría poder mostrar las fotos en la columna de la izquierda y los videos en la columna de la derecha, pero que todos los resultados compartan paginación...

Un saludo y gracias por contestar.
  #4 (permalink)  
Antiguo 19/01/2013, 03:16
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Mostrar resultados mysql en 2 columnas distintas

A ver si he entendido bien, el problema es que solo quieres hacer una consulta a mysql, pero sin embargo tienes 3 tablas. Es imposible sacar resultados de 3 tablas con una sola consulta.

Yo en tu lugar, lo que haría es guardar todos los datos en la tabla "PRINCIPAL", por ejemplo:

PRINCIPAL: id, visitas, titulo, descripcion,URL, vista_previa, tipo, fecha

Ahora pra diferenciar esta foto lo que haría es un separador que me diga si es foto y video y luego separarlo con "explode" en PHP, por ejemplo:

Si es foto guardaría en el campo URL: foto|direccionfoto.jpg

Si es video guardaría en el campo: video|http://yotubeembed.com

Despues al extrarlo en la consulta con explode comparas si es video o foto:

Código PHP:
$separar explode("|",$array['URL']);
if(
$separar[0] == "foto"){
    
$mostrar '<img src="'.$separar[1].'">';
}else{
    
$mostrar '<youtube embed="'.$separar[1].'" width="500" height="500"'>; //El código de youtube

Despúes para mostrar en la página

Código PHP:
<table>
<tr>
<td>
<? echo $mostrar?>
</td>
</tr>
</table>
No sé si es algo así lo que estás buscando, ya tendría que adaptarlo a tus datos y tu tabla HTML
  #5 (permalink)  
Antiguo 19/01/2013, 04:00
Avatar de Capimaster  
Fecha de Ingreso: agosto-2004
Mensajes: 494
Antigüedad: 19 años, 8 meses
Puntos: 2
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Esto puede ser facil asi...

Código PHP:

if ($row['tipo'] == '1') {
echo 
'esto para foto';

se me ocurre por facil que repitas el codigo en ambas columnas
solo que en la columna de video cambia el 1 por el 2 bueno en realidad no se con cual identifiques cual...

espero te pueda servir y sea esa tu duda
__________________
http://www.elcapitolio.com.mx - Ocotlán, Jalisco, México
  #6 (permalink)  
Antiguo 19/01/2013, 04:20
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, 5 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
A ver si he entendido bien, el problema es que solo quieres hacer una consulta a mysql, pero sin embargo tienes 3 tablas. Es imposible sacar resultados de 3 tablas con una sola consulta.


@manuparquegiralda:
En eso estás completamente equivocado. Por eso existen las bases de datos. Me sorprende que digas algo así...
COnsultas únicas que invoquen 2, 3, 4 ó 36 tablas son muy habituales en el SQL.

En realidad como consulta lo que necesita no es complejo, lo complejo está dado por el esquema de base que tiene que no parece correcto para lograr ese tipo de resultados. Pero eso es tema de otro foro (este post también, pero no puedo cambiarlo de lugar).
Yo lo veo de esta forma: Si Principal con tiene los datos de la galería, entonces es la primera tabla
Código SQL:
Ver original
  1. SELECT id, visitas, titulo, descripcion, vista_previa, tipo, fecha
  2. FROM principal;
Ahora bien, supongamos se requiera mostrar todos los videos relacionados con la misma galería:
Código SQL:
Ver original
  1. SELECT
  2.     P.id,  
  3.     P.visitas,  
  4.     P.titulo,  
  5.     P.descripcion,  
  6.     P.vista_previa,  
  7.     P.tipo,  
  8.     P.fecha,  
  9.     V.codigo_video
  10. FROM principal P INNER JOIN videos V ON P.id = V.id_principal;
El problema es cómo reunir esto con las fotos.
Hay dos formas de lograrlo. Una es usando LEFT JOIN porque a priori no sabemos si hay más galerías con fotos que galerías con videos (si sólo hubiese una foto y un único video, la separacion en tres tablas carece de sentido).
Esto nos llevaría a esta consulta:
Código SQL:
Ver original
  1. SELECT
  2.     P.id,
  3.     P.visitas,
  4.     P.titulo,
  5.     P.descripcion,
  6.     P.vista_previa,
  7.     P.tipo,
  8.     P.fecha,
  9.     V.codigo_video,
  10.     F.nombre_foto
  11. FROM principal P
  12.     LEFT JOIN videos V ON P.id = V.id_principal
  13.     LEFT JOIN fotos F ON P.id = F.id_principal;
Pero eso podría generar un producto cartesiano con muchísimas repeticiones.
La solución que veo más práctica es por doble vía: Una consulta que devuelva sólo el ID principal con dos columnas conteniendo la lista de videos y la lista de fotos relacionadas. Algo como:
Código SQL:
Ver original
  1. SELECT
  2.     P.id Galeria,
  3.     IFNULL(GROUP_CONCAT(V.codigo_video), '') Videos,
  4.     IFNULL(GROUP_CONCAT(F.nombre_foto), '') Fotos
  5. FROM principal P
  6.     LEFT JOIN videos V ON P.id = V.id_principal
  7.     LEFT JOIN fotos F ON P.id = F.id_principal
  8. GROUP BY P.id
Luego, en la programación armas la segunda y tercera columna en función a la cantidad de items que te regrese la consulta.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 19/01/2013, 17:42
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
La solución que veo más práctica es por doble vía: Una consulta que devuelva sólo el ID principal con dos columnas conteniendo la lista de videos y la lista de fotos relacionadas. Algo como:
Código SQL:
Ver original
  1. SELECT
  2.     P.id Galeria,
  3.     IFNULL(GROUP_CONCAT(V.codigo_video), '') Videos,
  4.     IFNULL(GROUP_CONCAT(F.nombre_foto), '') Fotos
  5. FROM principal P
  6.     LEFT JOIN videos V ON P.id = V.id_principal
  7.     LEFT JOIN fotos F ON P.id = F.id_principal
  8. GROUP BY P.id
Luego, en la programación armas la segunda y tercera columna en función a la cantidad de items que te regrese la consulta.
Eso, en la práctica, significa no hacer esa query, y hacer sólo la segunda y la tercera.
Lo que está aquí confundiendo es la presunción que hace el OP de que necesita 1 sola query, para tener la misma paginación.

Código SQL:
Ver original
  1. SELECT * FROM (SELECT *
  2. FROM principal P
  3.     LEFT JOIN videos V ON P.id = V.id_principal
  4. LIMIT <start>,<nrows>) videos WHERE V.id_principal IS NOT NULL;

y

Código SQL:
Ver original
  1. SELECT * FROM (SELECT *
  2. FROM principal P
  3.     LEFT JOIN fotos F ON P.id = F.id_principal
  4. LIMIT <start>,<nrows>) fotos WHERE F.id_principal IS NOT NULL;

Entiendo que el OP está usando un mapeado de herencia en varias tablas, por lo que 1 id en principal, corresponde a una foto, o a un video.

Lo que no entiendo es a qué llama "paginar" 2 cosas distintas a la vez.Si muestras 10 resultados, igual todos son videos, o todos son fotos, con lo que una columna queda vacía...Supongo que eso te da igual..
  #8 (permalink)  
Antiguo 19/01/2013, 17:58
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, 5 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Error de consulta:
Código MySQL:
Ver original
  1. FROM principal P
  2.     LEFT JOIN fotos F ON P.id = F.id_principal
  3. LIMIT <start>,<nrows>) fotos WHERE F.id_principal IS NOT NULL;
Porque en ese LEFT JOIN donde la segunda tabla es "F", sólo te devolvería aquellos registros de la principal donde no hubiese fotos relacionadas, lo que no cumple con lo deseado.
Además, esa sintaxis te daría un error porque el alias "fotos" de la subconsulta anula los alias internos de la misma.

Cita:
Entiendo que el OP está usando un mapeado de herencia en varias tablas, por lo que 1 id en principal, corresponde a una foto, o a un video.
Creo que no. Si te fijas está indicando que tiene dos tablas relacionadas con la cabecera (Principal), una para fotos y otra para videos.
Se requieren las tres tablas para responder esa consulta.

La última que le propongo le devolverá ambas cosas, o ningún dato en las columnas sino existen, haya lo que haya en las tablas secundarias.

Puede resultar poco claro porque la lógica de arquitectura de datos es diferente de la lógica de programación. Las cosas se piensan de otro modo (y no es broma).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 19/01/2013, 18:06
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Mostrar resultados mysql en 2 columnas distintas

No.
El select interno lo que fija es la paginación. Si quiero los 10 primeros resultados, el select interno me devuelve los 10 primeros registros de P, y, para aquellos que son fotos, me devuelve los datos.El select externo filtra, y se queda solo con las rows que son fotos.

Se repite lo mismo, pero para videos.
Entre la query de fotos, y la de videos, se tienen las 10 primeras filas de la tabla Principal.En la query de fotos, se han obtenido los datos para las filas que eran fotos, y en la de videos, para las filas que eran videos.

Lo único que está mal de esa query , es que fuera uso WHERE F.id_principal IS NOT NULL; , cuando deberia ser:
Código MySQL:
Ver original
  1. FROM principal P
  2.     LEFT JOIN fotos F ON P.id = F.id_principal
  3. LIMIT <start>,<nrows>) fotos WHERE id_principal IS NOT NULL;
(Demasiado copy-paste)
No hay ningún problema en poner alias a subconsultas, con el mismo nombre de una tabla usada en la subconsulta.
  #10 (permalink)  
Antiguo 19/01/2013, 18:14
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, 5 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Se perfectamente para qué se usa el LIMIT. Pero no ha pedido una paginación de cada 10, sino ver cómo lo grar mostrar en sendas columnas los videos y/o fotos vinculados a una misma entrada de la tabla principal (si no fuera la misma en ambos objetos, la FK no tendría sentido).
Por otro lado, ¿para qué haces dos consultas donde puedes hacer una sola, aprovechando la potencia y capacidades de un motor de bases de datos?
Es un desperdicio de recursos.
Cita:
Lo único que está mal de esa query , es que fuera uso WHERE F.id_principal IS NOT NULL; , cuando deberia ser WHERE id_principal IS NOT NULL (problema de copy-paste).
Si lo intentas con la tabla original, obtendrás un error por columna ambigua (las dos tablas tienen una columna con el mismo nombre).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 19/01/2013, 18:16
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Cita:
Entiendo que el OP está usando un mapeado de herencia
en varias tablas, por lo que 1 id en principal, corresponde a una foto, o a un video.
Creo que no. Si te fijas está indicando que tiene dos tablas relacionadas con la cabecera (Principal), una para fotos y otra para videos.
Se requieren las tres tablas para responder esa consulta.
Exactamente eso es un mapeado de herencia en varias tablas.La "clase base" es una tabla, y las derivadas, otras tablas.En contraposición de usar 1 sola tabla con un campo "tipo", y columnas para todas las clases derivadas posibles.

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Puede resultar poco claro porque la lógica de arquitectura de datos es diferente de la lógica de programación. Las cosas se piensan de otro modo (y no es broma).
No.En este caso, es exactamente igual que la arquitectura de aplicación.Si usara un ORM, hay una relación 1 a 1 entre clases y tablas.La clase base tiene su tabla, las derivadas también.
Si usara derivación en una sola tabla, es cuando sería diferente.
  #12 (permalink)  
Antiguo 19/01/2013, 18:21
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Por otro lado, ¿para qué haces dos consultas donde puedes hacer una sola, aprovechando la potencia y capacidades de un motor de bases de datos?
Es un desperdicio de recursos.
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.
Cambiar los NULL por '', o por agrupaciones de algo que no viene duplicado...No sé cómo aprovecha la potencia.


Cita:
Si lo intentas con la tabla original, obtendrás un error por columna ambigua (las dos tablas tienen una columna con el mismo nombre).
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.

Última edición por dashtrash; 19/01/2013 a las 20:27
  #13 (permalink)  
Antiguo 20/01/2013, 01:12
Avatar de arcanisgk122  
Fecha de Ingreso: junio-2010
Mensajes: 755
Antigüedad: 13 años, 11 meses
Puntos: 28
Respuesta: Mostrar resultados mysql en 2 columnas distintas

mira en tu caso puedes hacer el recorrido por array de las dos columnas en 2 querry diferentes, y guardas los valores, luego en un ciclo while metes que si es Video imprima si es foto no, en el otro lado haces lo mismo pero a la inversa imprimir fotos, videos no, en tal caso puedes recorrer los 2 arrays que creaste y imprimirlos... seria como aprovechar mas la potencia para generar visualmente lo que quieres...
__________________
Cooler Master Gladiator 600 - AMD PHENOM II X4 955 @ 3.5GHZ
GA-MA78GM-US2H - Super Talent 800 2GB x 2 Dual, (Unganged)
PSU Cooler Master eXtreme Power Plus 500W - Saphire R7-260OC-2GB
  #14 (permalink)  
Antiguo 20/01/2013, 05:45
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, 5 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)
  #15 (permalink)  
Antiguo 20/01/2013, 13:49
Avatar de dashtrash
Colaborador
 
Fecha de Ingreso: abril-2007
Ubicación: Ni en Sevilla,ni en Sanlúcar..qué más da..
Mensajes: 927
Antigüedad: 17 años, 1 mes
Puntos: 270
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
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.
...en una relación 1 a 1, lo cual produce un producto cartesiano de cardinalidad igual a 1.
De hecho, si eso generara un producto cartesiano, no siendo la relación 1 a 1, e hicieras un GROUP_BY, exactamente, me puedes decir cómo haces la paginación, si a priori no sabes si después de agrupar vas a tener 1, 2,8 o 10 resultados?

Cita:
Inevitable para mi, porque trabajo profesionalmente como DBA. Tengo ciertos hábitos de codificación adquiridos.
Yo trabajo profesionalmente desde hace muchos años como jefe de programción y optimizando código de otros programadores.Así que, tengo "ligera idea" de qué es un DBA, un "producto cartesiano", y las "posibilidades de una base de datos".
Tu query, y cualquiera basada en LEFT_JOIN sobre las dos tablas, están dejando en manos del programador el reorganizar qué son vídeos y qué son fotos.
Tanto si lo dejas como null, o como '', lo que estás cambiando es el test que va a tener que hacer el programador (y ni eso....lo habitual es un test ==, no ===), así que da lo mismo.

Cita:
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).
Dejando en manos del programador que tenga que hacer cosas como explodes() sobre el campo...Código precioso.
Aparte, en qué punto dice el OP que los id's son compartidos entre vídeos y fotos? Qué sentido tiene eso? Las relaciones de video y foto con principal, son 1:1.
Repito.Si no fueran 1:1, dime cómo paginas con un GROUP_BY.

Cita:
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.

Tendrás en algun momento problemas con esos dos campos si usases esos campos como condición.
Ya..y si pusiera un nombre de campo no existente, también tendría problemas...Pero es que no he puesto eso.Si propones un caso hipotético para "advertirme" de que habría problemas..Siento decirte que eso lo aprendí hace como 13 años...
No pienses que todos los que vienen al foro no saben distinguir los campos seleccionados de las condiciones..O que llevan en esto dos días..Estaría muy bien...

Cita:
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,
Oh, gracias por la concesión...Pero vuelves a equivocarte.
Si quisiera saber a qué campo pertence cada columna, con mysql_field_table, y accediendo a las columnas por índice, en caso de que lo necesitara, tendría a qué tabla pertence cada columna.
No hay ambiguedad ninguna.
  #16 (permalink)  
Antiguo 20/01/2013, 14:22
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, 5 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Si quieres iniciar un debate teórico sobre todo este asunto, lo podemos hacer en otra oportunidad, y en un thread propio para el caso. Acá estamos molestando con discusiones que no solucionarán nada a lo que el forista desea lograr.
Yo prefiero esperar un poco más de info de parte de @CeRo_ByTe, ver qué intentó, y qué es lo que prefiere encarar para su necesidad.
El thread no es nuestro. Es sobre algo que él necesita resolver.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 20/01/2013 a las 15:02
  #17 (permalink)  
Antiguo 21/01/2013, 08:21
 
Fecha de Ingreso: enero-2007
Mensajes: 158
Antigüedad: 17 años, 3 meses
Puntos: 2
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Gracias @gnzsoloyo, reconozco que en algunos mensajes de los compañeros me he perdido. Debo mejorar mi nivel de programación...

Desconozco el nivel de dificultad, para mi es dificil ya que no lo se hacer, pero creo que no debe ser tan complicado como algunos compañeros han apuntado.

La tabla de la base de datos llamada PRINCIPAL almacena todos los datos necesarios que yo mostraré en la index de mi página, es decir, mostrará títulos, descripciones, vista previa de la noticia, etc.
Por eso mismo, da igual que sea un video, que una imagen ya que el formato con el que se mostrará será el mismo:

TÍTULO
VISTA PREVIA
DESCRIPCIÓN
ENLACE PARA LEER EL RESTO DE LA NOTICIA

Bien, si yo utilizo esta sentencia:

Código PHP:
$sql "SELECT * FROM principal ORDER BY id ASC";
$resultado mysql_query($sql) or die("Error al conectar con la base de datos");
while (
$fila mysql_fetch_object($resultado))
{
 echo 
$fila->titulo."<br />".$fila->vista_previa."<br />".$fila->descripcion."<br />";

Como ya sabrás, esto hace que me muestre una lista completa con todos los resultados que yo tengo en mi tabla PRINCIPAL, es decir, muestra todos los resultados en una sola columna.

Mi idea sería hacer que mostrasé los resultados en dos columnas, pero no de cualquier modo... Me gustaría que las entradas de la tabla principal que fuesen "fotos" se mostrasen en una columna y los "videos" en otra. ¿Cuál es el problema?

Que yo podría hacer dos consultas a la tabla principal:
//Muestro en la columna de la izquierda
Código PHP:
//1 representa que es FOTO
$sql "SELECT * FROM principal WHERE tipo = '1' ORDER BY id ASC";
$resultado mysql_query($sql) or die("Error al conectar con la base de datos");
while (
$fila mysql_fetch_object($resultado))
{
 echo 
$fila->titulo."<br />".$fila->vista_previa."<br />".$fila->descripcion."<br />";

//Muestro en la columna de la derecha
Código PHP:
//2 representa que es VIDEO
$sql "SELECT * FROM principal WHERE tipo = '2' ORDER BY id ASC";
$resultado mysql_query($sql) or die("Error al conectar con la base de datos");
while (
$fila mysql_fetch_object($resultado))
{
 echo 
$fila->titulo."<br />".$fila->vista_previa."<br />".$fila->descripcion."<br />";

Haciendolo así consigo que muestre cada tipo de noticia (fotos y video) por separado, en columnas bien diferenciadas, pero el problema esta en que no podré compartir la paginación de los resultados.

Es decir, al final de la página mostraré un paginador de resultados mediante código PHP del tipo:
[Anterior][1][2]...[5]...[8][9][Siguiente]

Esta paginación solo la podré hacer a una de las consultas mysql que he indicado anteriormente... o eso o hago 2 paginaciones una para cada columna, pero eso no quedaría nada bien ya que confundiría al visitante.

Por lo que la solución sería hacer una única consulta y conseguir (no se como) que la lista de videos se muestre a un lado y la lista de fotos al otro lado, compartiendo ambas columnas la misma paginación. (He intendado hacer esto mediante CSS y los "float" pero es una solución no demasiado correcta).

Espero que haya aclarado un poco más lo que ando buscando, y doy las gracias a todos por colaborar en solucionar mi duda.

Un saludo.
  #18 (permalink)  
Antiguo 21/01/2013, 10:43
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, 5 meses
Puntos: 2658
Respuesta: Mostrar resultados mysql en 2 columnas distintas

Queda un poco más claro ahora hacia dónde vas.
En general, recorrer paralelamente los dos resultados y mostrarlos en pantalla no debería representar ningún problema, porque los recorres en paralelo.
Supongo que en esa etapa no debes tener problemas, ¿no?

Pero como las consultas pueden devolver en un momento cantidades diferentes de registros, si hay más fotos que videos o viceversa, puede que haya que afinar un poco las cosas en lo que se muestra (la otra tabla, si se debe visualizar, recibiría campos vacíos o no se la representaría).

En general, el uso del LIMIT en la query debería ser suficiente, tomando como parámetro la máxima cantidad devuelta por ambas consultas, para la siguiente etapa, si las consultas son sucesivas y no una única query para todo el paginado.

¿Esto es mas o menos el tema?

¿Podrías mostrarnos el script de la paginación como lo has planteado hasta ahora?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 21/01/2013 a las 10:50

Etiquetas: columnas, distintas, mysql, registro, resultados, 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 01:31.