Retroceder   Foros del Web > Programación para sitios web > Bases de Datos > Mysql

Respuesta
 
Herramientas Desplegado
Antiguo 13-may-2008, 09:48   #1 (permalink)
mafima está en el buen camino
 
Avatar de mafima
 
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 939
Hacer un inner join pero que no devuelva varias filas

Buenos dias tengo el siguiente problema con un inner join.

tengo dos tablas

intercambio_idioma
ID_usuario_intercambio
fecha_registro

en esta tabala meto los usuarios de intercambio idioma


intercambio_idioma_aprender
ID_usuario_intercambio_aprender
ID_idioma_aprender

Quiero seleccionar el ID_usuario_intercambio y el ID_idioma de la tabla intercambio_idioma_aprender.

Lo que sucede es que la tabla 'intercambio_idioma_aprender' puede tener varios idiomas para el mismo usuario entonces para una cosnulta con INNER JOIN asi:



select ID_usuario_intercambio, ID_idioma_aprender FROM intercambio_idioma INNER JOIN intercambio_idioma_aprender ON intercambio_idioma.ID_usuario_intercambio=intercam bio_idioma_aprender.ID_usuario_intercambio_aprende r


me arroja un resultado mas o menos asi:

ID_usuario_intercambio | ID_idioma_aprender
43 1
43 37
88 2
22 3
22 5
22 4


pero quiciera obtener un resultado asi:


ID_usuario_intercambio | ID_idioma_aprender | ID_idioma_aprender | ID_idioma_aprender
43 1 37
88 2
22 3 5 4


quiero hacerlo asi por que luego puedo tomar los resultados con mysql_fetch_assoc, o que me aconsejan ustedes?

Por su tiempo muchas gracias.
__________________
hotel
Derecho

Última edición por mafima; 13-may-2008 a las 09:55.
mafima está desconectado   Responder Citando
Antiguo 13-may-2008, 10:27   #2 (permalink)
jurena tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 509
Re: Hacer un inner join pero que no devuelva varias filas

Si lo quieres hacer en MySQL, obtendrás dos campos, uno con el id del usuario y otro con los distintos id de los idiomas separados con el separador que quieras (en el ejemplo, un espacio en blanco). Para eso se usa GROUP_CONCAT del campo que quieras reunir y GROUP BY del campo que sirve para agrupar, en tu caso el ID de usuario.

select ID_usuario_intercambio, GROUP_CONCAT (CAST (ID_idioma_aprender AS CHAR), ORDER BY ID_idioma_aprender, SEPARATOR ' ') AS idiomas FROM intercambio_idioma INNER JOIN intercambio_idioma_aprender ON intercambio_idioma.ID_usuario_intercambio=intercam bio_idioma_aprender.ID_usuario_intercambio_aprende r GROUP BY ID_usuario_intercambio

De todas formas, existen otras opciones con PHP mediante uso de matrices, etc. Pregunta en ese foro si no te satisface esta solución.

Última edición por jurena; 13-may-2008 a las 11:04.
jurena está desconectado   Responder Citando
Antiguo 13-may-2008, 12:57   #3 (permalink)
mafima está en el buen camino
 
Avatar de mafima
 
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 939
Re: Hacer un inner join pero que no devuelva varias filas

eso he hecho pero el moderador traslado el mensaje erroneamente, al parecer no cree que hayan varias soluciones para un mismo problemas.

:(

muchas gracias pro tu ayuda
__________________
hotel
Derecho
mafima está desconectado   Responder Citando
Antiguo 13-may-2008, 13:56   #4 (permalink)
jurena tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 509
Re: Hacer un inner join pero que no devuelva varias filas

El moderador sabe lo que hace, mafima, el problema es cómo lo has planteado en PHP. Pide ayuda para manejar una carga de datos en una matriz y para luego agrupar esos datos desde dentro de la matriz.
jurena está desconectado   Responder Citando
Antiguo 14-may-2008, 09:57   #5 (permalink)
mafima está en el buen camino
 
Avatar de mafima
 
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 939
Re: Hacer un inner join pero que no devuelva varias filas

Es que si lo hago solo con matrices consumiria mucho espacio en memoria, porque los resultados facilmente superan los 10000 registros, y para meterlos en diferentes vectores y reorganizarlos seria muy lento y poco optimo.

es por ello que pregunte directamente por una funcion alternativa a mysql_fetch_assoc

y no se como plantearlo de manera diferente, porque para que los del foro de PHP me entiendan que es lo que quiero hacer debo de poner el codigo SQL para ver si hay alguna funcion de PHP que me agrupe directamente lo que saco de una base de datos agrupado por GROUP BY. ( ya que myslq_fetch_assoc o mysql_fetch_array no lo hacen )
__________________
hotel
Derecho
mafima está desconectado   Responder Citando
Antiguo 14-may-2008, 12:54   #6 (permalink)
jurena tiene algunos puntos positivos de karma
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 509
Re: Hacer un inner join pero que no devuelva varias filas

mafima,

si lo que quieres es recoger en PHP eso, es decir el dato que te muestra el GROUP_CONCAT, es muy simple: a la consulta SQL le pones un alias tras el group_concat(...) AS idiomas. De hecho, creo que te puse ese alias para que lo vieras. Luego en php cargas ese alias como si del nombre de un campo se tratase. Ya sabes, mysql_fetch_array... etc., y luego muestras la lista con $row['idiomas']. Y ya está.

Última edición por jurena; 18-may-2008 a las 01:13.
jurena está desconectado   Responder Citando
Antiguo 16-may-2008, 14:26   #7 (permalink)
mafima está en el buen camino
 
Avatar de mafima
 
Fecha de Ingreso: abril-2003
Ubicación: Medellin-Colombia
Mensajes: 939
Respuesta: Hacer un inner join pero que no devuelva varias filas

ok, muchas gracias
__________________
hotel
Derecho
mafima está desconectado   Responder Citando
Respuesta
No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 01:38.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93