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

Todo en una misma consulta "select", ¿será posible?

Estas en el tema de Todo en una misma consulta "select", ¿será posible? en el foro de Mysql en Foros del Web. Hola, necesito crear una consulta única (por ahorrar) en la cual recojer distintos resultados de varias tablas. Las tablas: Tabla "miembro", contiene datos del miembro. ...
  #1 (permalink)  
Antiguo 09/04/2009, 09:10
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Todo en una misma consulta "select", ¿será posible?

Hola, necesito crear una consulta única (por ahorrar) en la cual recojer distintos resultados de varias tablas.

Las tablas:
Tabla "miembro", contiene datos del miembro.
Tabla "docu", contiene documentos/informes elaborados por usuarios, se relaciona con la tabla "miembro".
- Tabla "coment", contiene comentarios de los documentos, se relaciona con la tabla "docu" y a la vez con la tabla "miembro".

Bien, al acceder a una sección en concreto, quiero mostrar.
- Datos del miembro (quien redacta los informes).
- Listar todos los informes disponibles de ese miembro (paginar)
- Listar todos los comentarios correspondientes a dicho informe (paginar)

Mi consulta actual:
SELECT m.nombre, m.edad, d.titulo, d.descripcion, d.id, c.texto
FROM miembro m, docu d, coment c
WHERE d.id_miembro = m.id
AND c.id_docu = d.id

Al ejecutar, se repiten los registros del miembro hasta finalizar el listado de documentos y comentarios.. me gustaría saber si se puede evitar ello.
También ¿cómo aplico la paginación en esa consulta?

¿Quizá los registros a paginar si o si deben ir por consultas separadas?

En fin, un poco de lio si..

Gracias.
  #2 (permalink)  
Antiguo 09/04/2009, 09:31
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Todo en una misma consulta "select", ¿será posible?

Que tal xixy

Prueba anidadndo la consulta.
Código mysql:
Ver original
  1. select m.nombre, m.edad, d.titulo, d.descripcion, d.id, c.texto from miembro m inner join docu d  on m.id_miembro = d.id_miembro inner join coment c on d.id_docu = c.id_docu

"mira como se llaman las llaves de las tablas. yo puse id_miembro id_docu. "

Para paginar la consulta, puedes hacer uso de la clausula limit. y controlarla desde el lenguaje de programación.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 09/04/2009, 10:51
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Todo en una misma consulta "select", ¿será posible?

Gracias, comprendo que haya que aplicar LIMIT para paginar (en la programación tengo conocimientos), pero mi pregunta es cómo lo aplico en esa misma consulta SQL, ya que serían dos LIMIT (uno para el listado de documentos y otro para comentarios). Por eso pregunto si para ello, haya que hacer dos consultas diferentes.
  #4 (permalink)  
Antiguo 09/04/2009, 11:33
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Todo en una misma consulta "select", ¿será posible?

SELECT m.nombre, m.edad, d.titulo, d.descripcion, d.id, c.texto FROM miembro m INNER JOIN docu d on m.id_miembro = d.id_miembro INNER JOIN coment c on d.id_docu = c.id_docu limit X,Y
donde X quivale al registro que inicia la salida y Y equivale al numero de registros que desea mostrar.

Con respecto a lo que preguntas, si necesitas dos salidas requieres de dos consultas. Si los datos qu requieres estan relacionados, y se comportan en el mismo orden ambos, puedes hacer una consulta anidada como la anterior y mostrar los campos por separado en 2 salidas en el sistema.

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 09/04/2009, 11:52
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Todo en una misma consulta "select", ¿será posible?

Eso es Hueson, a eso me referia.. entonces si la cantidad de registros de salida que requiero para paginar son diferentes, si o si debo crear una consulta aparte para alguna, no? en ese caso seguro cree una para los comentarios.

Otra duda que tengo es la similitud de consultas (sin la tabla comentarios).
Código:
SELECT m.id_miembro, m.nombre, m.edad, d.titulo, d.descripcion, d.id
FROM miembros m
INNER JOIN docu d
ON m.id_miembro = d.id_miembro
AND m.nombre = '$nombre'
- Muestro los datos del miembro.
- Listado de los documentos del miembro.

Esta otra consulta produce exactamente la misma salida.
Código:
SELECT m.id_miembro, m.nombre, m.edad, d.titulo, d.descripcion, d.id
FROM miembros m, docu d
WHERE m.id_miembro = d.id_miembro
AND m.nombre = '$nombre'
Yo a lo que me referia en un principio era que en consola MySQL, se repite los datos del miembro hasta que termine de listar todos los documentos, pero en la programación eso se arregla fácil. Lo que quería saber es si hay forma desde la propia SQL dejar de listar los datos del miembro (aunque se sigan listando los documentos) o bien no influye en nada ese efecto?

Gracias otra vez.
  #6 (permalink)  
Antiguo 09/04/2009, 12:20
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Todo en una misma consulta "select", ¿será posible?

Cita:
Eso es Hueson, a eso me referia.. entonces si la cantidad de registros de salida que requiero para paginar son diferentes, si o si debo crear una consulta aparte para alguna, no? en ese caso seguro cree una para los comentarios.
Xixy.. no te entiendo muy bien lo que preguntas. Ni lo que tratas de hacer. Quieres por ejemplo, que el usuario elija la cantidad de registros por pagina? Si es así, desde cualquier lenguaje puedes enviar los parametros del limit y paginar a tu antojo una unica consulta.

Cita:
Otra duda que tengo es la similitud de consultas (sin la tabla comentarios).
Depediendo del caso la salida es la misma. Con inner joiin muestra unicamente los que se relacionen en las tablas. En la segunda consulta, requieres de la validación de la similitud de las tablas. Con inner join es mas rapida.

Cita:
Yo a lo que me referia en un principio era que en consola MySQL, se repite los datos del miembro hasta que termine de listar todos los documentos, pero en la programación eso se arregla fácil. Lo que quería saber es si hay forma desde la propia SQL dejar de listar los datos del miembro (aunque se sigan listando los documentos) o bien no influye en nada ese efecto?
Podrías poner un ejemplo real de la salida que quieres? Y como dices que se arregla en la programación?

Un saludo xixy
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 10/04/2009, 13:31
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Todo en una misma consulta "select", ¿será posible?

Hola simplemente me referia que en la salida, hasta no terminar de listar todos los documentos registrados, se repite los datos del mismo usuario. En programación eso no influye usando bucles.

En otras palabras (salida consola).
-
datos usuario1 | documento1
datos usuario1 |documento 2
datos usuario1 |documento 3
etc..
-

A eso me refiero, mientras se listan los documentos se repite el mismo dato de usuario y yo preguntaba si existia forma de evitarlo y se vea asi:

-
datos usuario1 | documento1
| documento2
|documento3
etc..
-
  #8 (permalink)  
Antiguo 10/04/2009, 13:47
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Todo en una misma consulta "select", ¿será posible?

Luego de trabajar un poco con la consulta "única", me di cuenta que requiero pulir más segun lo siguiente, espero puedan ayudarme.

Necesito mostrar.
- Datos del usuario.
- Datos de su grupo (si no tiene.. mostrar su valor vacio).
- Libro del usuario.
- Listar todos los documentos correspondientes al libro del usuario.

Código:
Mi consulta actual:
SELECT l.id_libro, l.nombre, l.descripcion, d.id_docu, d.nombre, u.id_usuario, u.nombre, g.nombre
FROM libros l
INNER JOIN documentos d ON l.id_libro = d.id_libro
AND l.nombre = 'nombre del libro'
Aquí es donde empiezo a tener problemas ya que quiero mostrar los datos del usuario pero a la vez "si tiene grupo o no".

Código:
Mi consulta completa:
SELECT l.id_libro, l.nombre, l.descripcion, d.id_docu, d.nombre, u.id_usuario, u.nombre, g.nombre
FROM libros l
INNER JOIN documentos d ON l.id_libro = d.id_libro
AND l.nombre = 'nombre del libro'
LEFT JOIN usuarios u ON u.id_usuario = l.id_libro
Primero tengo problemas al querer agregar la petición de los datos del usuario, ya que se listan todos los documentos del libro en questión, pero no se limita ahí. También muestra documentos de sus otros libros (del mismo usuario).

Tampoco se como añadir a la consulta la petición del nombre del grupo, si no pertenece a ninguno.. pues me muestre el valor vacio (null).

Gracias y perdón por el lio.

Última edición por Xixy; 10/04/2009 a las 15:52
  #9 (permalink)  
Antiguo 11/04/2009, 08:10
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Todo en una misma consulta "select", ¿será posible?

Cita:
Mi consulta completa:
SELECT l.id_libro, l.nombre, l.descripcion, d.id_docu, d.nombre, u.id_usuario, u.nombre, g.nombre
FROM libros l
INNER JOIN documentos d ON l.id_libro = d.id_libro
AND l.nombre = 'nombre del libro'
LEFT JOIN usuarios u ON u.id_usuario = l.id_libro
Para que muestre el vacío en caso de que no tenga grupo podría ser con ifnull.

ifnull(g.nombre,'')

Asumo que la g equivale a la tabla grupos. Donde la relacionas?
Con que tabla(s) se relaciona grupos?

El ultimo left join usuarios, haces la comparación entre el id_usuario e id_libro? por que?

Un saludo.
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 12/04/2009, 08:02
 
Fecha de Ingreso: enero-2009
Mensajes: 46
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: Todo en una misma consulta "select", ¿será posible?

Hola, dejo mi consulta más reciente (utilizo otros left join, agrego un where al final) y una mejor explicación:
Código:
SELECT l.id_libro, l.nombre, l.descripcion, d.id_docu, d.nombre, u.id_usuario, u.nombre, g.nombre
FROM libros l
INNER JOIN documentos d ON l.id_libro = d.id_libro
LEFT JOIN usuarios u ON l.id_usuario = u.id_usuario
LEFT JOIN grupos g ON u.id_usuario = g.id_usuario
WHERE l.nombre = 'nombre del libro'
Cita:
Asumo que la g equivale a la tabla grupos. Donde la relacionas?
Con que tabla(s) se relaciona grupos?
La tabla "grupos" se relaciona con la tabla "usuarios" (se comprueba si el usuario tiene ya un grupo o no).

Cita:
El ultimo left join usuarios, haces la comparación entre el id_usuario e id_libro? por que?
Para comprobar si el usuario existente tiene un grupo creado, uso LEFT JOIN para que devuelva NULL en caso de no tener ninguno.
He corregido el "id", en vez de "id_libro" era "id_usuario", ahi quizá le ves más sentido.

Finalmente me muestra lo que deseo, pero quiero saber si mi consulta está bien desarrollada, el orden en general y left join's.

Gracias nuevamente.
  #11 (permalink)  
Antiguo 12/04/2009, 09:39
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 9 meses
Puntos: 360
Respuesta: Todo en una misma consulta "select", ¿será posible?

Yo la veo bien.
Y lo mas importante es que ya funciona.
Un saludo
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
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 22:30.