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

[SOLUCIONADO] Consulta en dos tablas (ordenación)

Estas en el tema de Consulta en dos tablas (ordenación) en el foro de Mysql en Foros del Web. Buenas, nuevo por aquí, aprovecho para saludar a todos! Estoy intentando realizar una consulta pero mis conocimientos de MySql no dan de si, a ver ...
  #1 (permalink)  
Antiguo 17/11/2014, 19:10
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Consulta en dos tablas (ordenación)

Buenas,

nuevo por aquí, aprovecho para saludar a todos!

Estoy intentando realizar una consulta pero mis conocimientos de MySql no dan de si, a ver si me podéis echar una mano.

Tabla 1: `base_users` -> `id`, `activityStamp`...
Tabla 2: `base_avatars` -> `userId`...

Se trata de listar todos los usuarios de la tabla `base_users` ordenados por `activityStamp` pero en el resultado se han de incluir en primer lugar todos los campos de `base_avatars` que tengan `userId`= `id` ordenados también por el `activityStamp` de la tabla 1.

Saludos!
Carlos.

Última edición por MusiDMusi; 18/11/2014 a las 04:41
  #2 (permalink)  
Antiguo 18/11/2014, 06:01
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta en dos tablas (ordenación)

http://www.lawebdelprogramador.com/c...racticoSQL.pdf

Como este hay muchos mas....

Código MySQL:
Ver original
  1. SELECT * FROM `base_users`u  INNER JOIN `base_avatars`a ON u.id=a.userId;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 18/11/2014, 08:00
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta en dos tablas (ordenación)

Gracias por la respuesta Quim, pero no es correcta, tu consulta devuelve solo los id que están en la tabla 2 (avatar).

La consulta ha de retornar los ids (id e userId son los mismos) que hay en las dos tablas en primer lugar han de ir los
de la tabla 2 y después los de la 1 y a la vez todos ordenados por la columna `activityStamp` de la tabla 1.

Ejemplo:

tabla 1:

id: ..... activityStamp:
--------------------------------------------
1 ....... 20:54 (indico con horas)
2 ....... 21:00
3 ....... 21:15
4 ....... 21:30

tabla 2:

userId :
---------------------------------------------
2
3

El resultado debe ser:

id:
------------------------------------------------
2
3
1
4

Primero van los userId (de la tabla 2) ordenado por
activityStamp que le corresponde al id igual de la
tabla 1 (userId = id).

Después van los restantes Id (de la tabla 1) también
ordenados por el activityStamp de la tabla 1.

Espero que se entienda bien.
Gracias!

Última edición por MusiDMusi; 18/11/2014 a las 08:05
  #4 (permalink)  
Antiguo 18/11/2014, 08:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Consulta en dos tablas (ordenación)

Bien.... LEFT.

Ufff no me acorde de ordenar....

Código MySQL:
Ver original
  1. SELECT * FROM `base_users`u  LEFT JOIN `base_avatars`a ON u.id=a.userId ORDER BY u.activityStamp;

Substituye * por la lista de campos con sus alias y separados por comas en el orden que desees....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 18/11/2014, 08:49
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta en dos tablas (ordenación)

No funciona, es ponerle el ORDER BY al LEFT JOIN y saltar error...
  #6 (permalink)  
Antiguo 18/11/2014, 09:03
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: Consulta en dos tablas (ordenación)

Cita:
Iniciado por MusiDMusi Ver Mensaje
No funciona, es ponerle el ORDER BY al LEFT JOIN y saltar error...
¿Qué error?

Hay más de mil errores funcionales definidos y codificados con sus respectivos mensajes en MySQL. ¿A cuál de todos te refieres?
__________________
¿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 18/11/2014, 09:18
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta en dos tablas (ordenación)

La consulta es está:
Código MySQL:
Ver original
  1. SELECT `u`.* FROM `bgs_base_user` AS `u`
  2.  
  3. INNER JOIN `bgs_base_user` base_user_table_alias ON base_user_table_alias.`id` = `u`.`id`
  4.  
  5. LEFT JOIN `bgs_base_user_suspend` base_user_suspend_table_alias ON base_user_suspend_table_alias.`userId` = `base_user_table_alias`.`id` INNER JOIN `bgs_base_user_online` AS `o` ON(`u`.`id` = `o`.`userId`)
  6.  
  7. LEFT JOIN `bgs_base_avatar` AS `a` ON `o`.`id` = `a`.`userId` ORDER BY `o`.`activityStamp`
  8.  
  9. WHERE (`base_user_suspend_table_alias`.`id` IS NULL)
  10.  
  11. ORDER BY `o`.`activityStamp` DESC LIMIT ?, ?

Una vez añadido el ORDER BY del segundo LEFT JOIN el error es:
Cita:
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE (`base_user_suspend_table_alias`.`id` IS NULL) ORDER BY `o`.' at line 6
Como véis estoy con dos tablas más, pero he simplificado ya que si se hacerlo simplificado lo puedo implementar con toda la consulta.
  #8 (permalink)  
Antiguo 18/11/2014, 09:25
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: Consulta en dos tablas (ordenación)

Ok....
Y me puedes decir qué hace este ORDER BY alli?:
Código MySQL:
Ver original
  1. SELECT `u`.*
  2. FROM `bgs_base_user` AS `u`
  3.     INNER JOIN `bgs_base_user` base_user_table_alias ON base_user_table_alias.`id` = `u`.`id`
  4.     LEFT JOIN `bgs_base_user_suspend` base_user_suspend_table_alias ON base_user_suspend_table_alias.`userId` = `base_user_table_alias`.`id`
  5.     INNER JOIN `bgs_base_user_online` AS `o` ON(`u`.`id` = `o`.`userId`)
  6.     LEFT JOIN `bgs_base_avatar` AS `a` ON `o`.`id` = `a`.`userId`
  7.  
  8.     -- ******* ORDER BY fuera de lugar *********
  9.  
  10.     ORDER BY `o`.`activityStamp`
  11.  
  12.     -- *************************************
  13.  
  14. WHERE (`base_user_suspend_table_alias`.`id` IS NULL)
  15. ORDER BY `o`.`activityStamp` DESC
  16. LIMIT ?, ?
No tiene nada que hacer en ese sitio.
__________________
¿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 18/11/2014, 11:14
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta en dos tablas (ordenación)

Si, miras era la anterior respuesta de Quimfv... y si miras más arriba verás
lo que aun estoy preguntando :)
  #10 (permalink)  
Antiguo 18/11/2014, 11:39
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: Consulta en dos tablas (ordenación)

Perdón, pero yo tomé la query de tu último post, y ese ORDER BY no debe ir alli.
¿Eso te quedó claro?
Si lo pones dispara un error de sintaxis.

En cada consulta SELECT sólo puede haber un único ORDER BY. Sólo puede haber otro si está contenido en una sunconsulta, que no es tu caso.

La query, limpiando basura, debería quedar así:
Código MySQL:
Ver original
  1. SELECT `u`.*
  2. FROM `bgs_base_user` u
  3.     INNER JOIN `bgs_base_user` BUT ON U.`id` = BUT.`id`
  4.     LEFT JOIN `bgs_base_user_suspend` BS ON BS.`userId` = BUT.`id`
  5.     INNER JOIN `bgs_base_user_online` O  ON U.`id` = O.`userId`)
  6.     LEFT JOIN `bgs_base_avatar` A ON O.`id` = A.`userId`
  7. WHERE BS.`id` IS NULL
  8. ORDER BY O.`activityStamp` DESC
  9. LIMIT ?, ?

Ahora bien, tu planteo inicial requiere de condiciones que pueden ser incompatibles en la consulta:
Cita:
Se trata de listar todos los usuarios de la tabla `base_users` ordenados por `activityStamp` pero en el resultado se han de incluir en primer lugar todos los campos de `base_avatars` que tengan `userId`= `id` ordenados también por el `activityStamp` de la tabla 1.
Para visualizarlo mejor necesitamos ver el resultado de la consulta pura:

Código MySQL:
Ver original
  1. FROM `bgs_base_user` u
  2.     INNER JOIN `bgs_base_user` BUT ON U.`id` = BUT.`id`
  3.     LEFT JOIN `bgs_base_user_suspend` BS ON BS.`userId` = BUT.`id`
  4.     INNER JOIN `bgs_base_user_online` O  ON U.`id` = O.`userId`)
  5.     LEFT JOIN `bgs_base_avatar` A ON O.`id` = A.`userId`
  6. WHERE BS.`id` IS NULL
  7. ORDER BY O.`activityStamp` DESC
  8. LIMIT ?, ?
A poartir de eso podriamos analizar mejor la composicion de la query, que no sería de extrañar que corresponda haber un UNION para cumplirla.
__________________
¿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; 18/11/2014 a las 11:47
  #11 (permalink)  
Antiguo 18/11/2014, 13:02
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta en dos tablas (ordenación)

Con UNION no se puede hacer, el numero de columnas consultadas en las dos bases de datos son distintos :(

Última edición por MusiDMusi; 18/11/2014 a las 15:44
  #12 (permalink)  
Antiguo 18/11/2014, 18:04
MusiDMusi
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Consulta en dos tablas (ordenación)

Solucionado, al final he hecho dos querys, el primero para los resultados en la tabla 1 que no están en la 2 y el segundo para los ids que andan en las dos tablas, he mezclado los dos resultados con un array_merge y funcionando!

Si, ya sé que hago dos querys en vez de una, pero cada una tiene la mitad del peso que tendría en solo una consulta, xD!

Etiquetas: campo, sql, tabla, tablas
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 00:49.