Comunidad de diseño web y desarrollo en internet online

Consulta SQL Multitabla

Citar            
MensajeEscrito el 03 May 2007 01:19 pm
Tengo dos tablas Ej:
Usuarios
Id Usuario Tiposeleccion
1 Yo 2
2 El 1
3 Ella 2
4... Ellos 3

Puntajes
id Idusu Puntajes
1 1 500
2 3 200
3 4 150
4 1 600
5 1 550
6... 3 900

Para unir uso la sentencia Sql:

Código :


Query= select * from Usuarios Left Join Puntajes On Usuarios.id=Puntajes.idusu;


Esto me Muestra:
Id Usuario Tiposeleccion id Idusu Puntajes
1 Yo 2 1 1 500
1 Yo 2 4 1 600
1 Yo 2 5 1 550
2 El 1 null null null
3 Ella 2 2 3 200
3 Ella 2 6 3 900
4... Ellos 3 3 4 150


Pero yo quiero que me puedes el Puntaje.Idusu mas grande por usuario solamente y no se como hacerlo, osea.-


Id Usuario Tiposeleccion id Idusu Puntajes
1 Yo 2 5 1 550
2 El 1 null null null
3 Ella 2 6 3 900
4... Ellos 3 3 4 150

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 03 May 2007 04:50 pm
no entiendo lo que pedis.

Por tomasdev

220 de clabLevel

1 tutorial

 

Argentina por ahora...

firefox
Citar            
MensajeEscrito el 03 May 2007 05:14 pm

Código :

select usuario,max(puntajes) from puntajes right join usuario on puntajes.idusu=usuario.id group by idusu


^^

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

firefox
Citar            
MensajeEscrito el 03 May 2007 07:29 pm
Ohh no había entendido su lo que quería hasta que vi la sentencia de Darel :o

Muy bien hecho Darel (y)

Por takag

637 de clabLevel



Genero:Femenino  

Informática-Cocinera-Catlover

firefox
Citar            
MensajeEscrito el 04 May 2007 02:50 pm

Código :


La Sentencia:
Query= select * from Usuarios Left Join Puntajes On Usuarios.id=Puntajes.idusu;
Esto me Muestra:
Id     Usuario  Tiposeleccion      id   Idusu Puntajes
1         Yo             2          1      1      500
1         Yo             2          4      1      600
1         Yo             2          5      1      550
2         El             1         null   null    null
3         Ella           2          2      3      200
3         Ella           2          6      3      900
4...      Ellos          3          3      4      150

Pero yo quiero que me devuelva los Puntaje.Id mas grandes por cada usuario que exista, ejemplo en este caso seria:

Id     Usuario  Tiposeleccion      id   Idusu Puntajes
1         Yo             2          5      1      550
2         El             1         null   null    null
3         Ella           2          6      3      900
4...      Ellos          3          3      4      150


Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 04 May 2007 03:08 pm
Ya probaste la sentencia que mostré?, sólo es cuestión que agregues los campos que quieres que te muestre.

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

firefox
Citar            
MensajeEscrito el 04 May 2007 03:53 pm
Prueba esto:

Código :

SELECT Id, usuario, tiposeleccion, id, max(Puntajes.idusu), Puntajes 
FROM Puntajes
WHERE exists (SELECT* 
         FROM Usuarios Left Join Puntajes On Usuarios.id=Puntajes.idusu)


A ver si entendí lo que necesitabas :crap:

De todas formas yo hice la siguiente prueba muy sencilla

Creé una tabla PRUEBA con los campos: num_id, num_id_usu.

La cargué con los siguientes datos:

num_id num_id_usu
1 1
1 2
1 3
2 1
2 4
2 6
3 2
3 6

Con esta sentencia:

Código :

select num_id, max(num_id_usu) from PRUEBA
where exists (select * from PRUEBA)
group by num_id


El resultado es este:

1 3
2 6
3 6

Ojalá te sirva de algo...

Saludos.

*lo edité porque había colocado el código sql sin identar :s

Por takag

637 de clabLevel



Genero:Femenino  



Ultima edición por takag el 04 May 2007 05:31 pm, editado 1 vez

Informática-Cocinera-Catlover

firefox
Citar            
MensajeEscrito el 04 May 2007 04:55 pm

Código :

SELECT usuario.id, usuario, tiposeleccion, idusu, max( puntajes )
FROM puntajes
RIGHT JOIN usuario ON puntajes.idusu = usuario.id
GROUP BY idusu
ORDER BY usuario.id


Es todo lo que pude hacer... :cry: , ¡Por Dios donde esta Dano!!??.

Si explicaras para que necesitas el id del puntaje tal ves se pueden buscar alternativas, eso creo.
Y para que quieres de nuevo el idusu, si se supone que que es mismo del id en "usuarios".

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

firefox
Citar            
MensajeEscrito el 05 May 2007 01:13 pm
Disculpenme por no haber respondido antes, pero no habia tenido tiempo.-
Exacto Takag eso mismo era lo que necesitaba.-

takag escribió:


Creé una tabla PRUEBA con los campos: num_id, num_id_usu.
La cargué con los siguientes datos:

num_id num_id_usu
1 1
1 2
1 3
2 1
2 4
2 6
3 2
3 6
Con esta sentencia:

Código :

select num_id, max(num_id_usu) from PRUEBA where exists (select * from PRUEBA) group by num_id

El resultado es este:

1 3
2 6
3 6

Ojalá te sirva de algo...
Saludos.
*lo edité porque había colocado el código sql sin identar :s


Eso mismo era lo que necesitaba, yo tambien intente hacer algo paresido pero lo estaba agregando al final de la pagina, despues del where:S :P
Se los Agradesco...

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 05 May 2007 03:08 pm

Código :

SELECT pu.idusu, nombre, apellido, mail, Max(pu.puntajes) AS Maximo
FROM Usuarios AS usu
Left Join Puntajes AS pu
ON (pu.idusu = usu.idusu)
GROUP BY pu.idusu



saludos ^^

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 05 May 2007 03:32 pm
Gracias Dano.-
Todavia no entiendo muy bien para que sirve el "GROUP BY " por lo que lei es paresido o igual que el "order by", al pareser no es haci.- :S

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 05 May 2007 03:39 pm
york3rs, el group by, es totalmente distinto del order by.

Básicamente el group by, es para agrupar un conjunto de registros basado en un campo, además esa agrupación se puede ordenar tal como lo explico aqui:
http://www.cristalab.com/foros/viewtopic.php?t=36146&highlight=group+++order

Tal vez esto te ayude un poco más:
http://www.sql-tutorial.com/sql-group-by-sql-tutorial/


saludos ^^

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 05 May 2007 04:11 pm
Ya entendi es algo paresido al "Distinc", pero y que pasa cuando agrupa con los demas campos? Los suma!! y cuando son caracteres.-
Como en este caso:

Código :

idProducto       Nombre      Categoria
    1           Producto 1    Bombas
    2           Producto 2    Bombas
    3           Producto 3    Armas
    4           Producto 4    Bombas
    5           Producto 5    Armas


SELECT * FROM Productos GROUP BY Categoria

Armas <- Es un grupo que contiene todo los registros cuya categoria es Armas
Bombas <- Es un grupo que contiene todo los registros cuya categoria es Bombas

Código :

idProducto       Nombre      Categoria
   ?                ?           Armas
   ?                ?           Bombas


Y si fuera:
SELECT * FROM Productos GROUP BY Categoria Asc
SELECT * FROM Productos GROUP BY Categoria Desc

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 05 May 2007 04:22 pm
Sí, york3rs, creo que ya estas entendiendo como va el group by.

Por cierto, el primer sql de Darel, tenía una idea muy similar a la mía. Vas por buen camino Darel. :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 05 May 2007 09:04 pm
La verdad, estaba acostumbrado a utilizar las consultas anidadas, pero después de tu explicación, pues decidí aprender de los grandes.

Saludos.

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

msie
Citar            
MensajeEscrito el 06 May 2007 12:31 am
Las consultas anidadas son utiles en algunas ocasiones se requieren porque no se puede resolver la consulta de otra manera - muchas veces es la solución por defecto de alguien que no entienda bien las uniones/intersecciones.

La documentación(el buscador apesta!) de MySQL.org no es muy buena que digamos pero vamos que a veces nos puede aclarar algunas cosas, asi que es bueno consultarla. A quien le pueda interesar eso de los JOIN (LEFT, RIGHT, INNER y demás) si lo aclara un poco.

Otra cosa es que Dano tiene un problema personal con el RIGHT JOIN :lol: , eso de que tu consulta iba bien Darel, en verdad es que hace lo mismo que la de él ;) . Yo en verdad la hubiera hecho como tu porque prefiero seleccionar (FROM) los datos desde la tabla que necesito realmentente me interesan en este caso los puntajes. Solo es cuestion de gustos :P



saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 06 May 2007 12:38 am
No tengo nada, contra RIGTH JOIN, lo que pasa es que no había visto el SQL de Darel, generalmente no leo todas las respuestas, lo siento, después cuando lo cheque y ví que el resultado era bueno, por eso lo dije, me gusta reconocer los buenos aportes, como los de Darel. Generalmente no me baso en mis gustos, sino en mi lógica. Y nada mas aclaro algo que nunca dije, pero no quiero que se confundan, las consultas anidadas no son malas(y cuando lo dije?) el problema es que muchos las usan inecesariamente(y tal vez redundantemente), y yo he corregido cuando las usan así.

saludos :wink:

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

clabbrowser
Citar            
MensajeEscrito el 06 May 2007 01:00 am

Dano escribió:

Y nada mas aclaro algo que nunca dije, pero no quiero que se confundan, las consultas anidadas no son malas(y cuando lo dije?)


No estaba muy familiarizado con el LEFT JOIN, RIGHT JOIN o INNER, es por eso que yo utilizaba las consultas anidadas cuando se podía simplificar de esta forma. Y no creo que las consultas anidadas sean malas (y no digo que alguna vez lo dijiste Dano), sólo que hay que usarlas en casos especiales como dice Maikel.

Pero la verdad es que he trabajado con ingenieros, y aprendí mucho de ellos, excepto el uso de LEFT o RIGHT join, ya que la unión de tablas las realizaban con "where tabla1.id=tabla2.id".

Hasta que observé los SQL de Dano, lo consideré mas eficáz y pues ahora trato de aplicarlos antes de usar las consultas anidadas.

En fin, aún no entiendo el problema de York3rs, ya que al parecer le sirvió la respuesta de Takag, aunque haya puesto de ejemplo sólo una tabla, lo cual es diferente a cruzar dos.

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

msie
Citar            
MensajeEscrito el 07 May 2007 11:39 pm
Aplique la sentencia:

Código :


SELECT pu.idusu, nombre, apellido, mail, Max(pu.puntajes) AS MaximoFROM Usuarios AS usuLeft Join Puntajes AS puON (pu.idusu = usu.idusu)GROUP BY pu.idusu

Id     Usuario  Tiposeleccion      id   Idusu Puntajes
1         Yo             2          1      1      600
2         El             1         null   null    null
3         Ella           2          2      3      900
4...      Ellos          3          3      4      150
NO:

Id     Usuario  Tiposeleccion      id   Idusu Puntajes
1         Yo             2          5      1      550
2         El             1         null   null    null
3         Ella           2          6      3      900
4...      Ellos          3          3      4      150

:S no me había dado cuenta pero vi que no correspondían los datos con lo que me estaban devolviendo.-



Explico.
Tengo un Usuario que juega X game - y hay un historial de los puntajes que ha sacado ese jugador en todos los juegos.-
Lo que yo quiero que me devuelva es el último puntaje que haya sacado ese jugador, no el más grande.-

Hice lo siguiente:

SELECT pu.idusu, nombre, apellido, mail, Max(pu.id) AS MaximoFROM Usuarios AS usuLeft Join Puntajes AS puON (pu.idusu = usu.idusu)GROUP BY pu.idusu <= Pero solo me devuelve el id mayor, no el puntaje mayor :S

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 08 May 2007 01:53 am

york3rs escribió:

Lo que yo quiero que me devuelva es el último puntaje que haya sacado ese jugador, no el más grande.-

Hice lo siguiente:

SELECT pu.idusu, nombre, apellido, mail, Max(pu.id) AS MaximoFROM Usuarios AS usuLeft Join Puntajes AS puON (pu.idusu = usu.idusu)GROUP BY pu.idusu <= Pero solo me devuelve el id mayor, no el puntaje mayor :S


¿Por fin que?... ¿quieres el último puntaje o el puntaje más alto?.

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

msie
Citar            
MensajeEscrito el 08 May 2007 01:21 pm
Yo al principio del post puse este mensaje, en el cual muestra super bien que lo que quiero que me devuelva el ultimo puntaje.-

york3rs escribió:

Código :


La Sentencia:
Query= select * from Usuarios Left Join Puntajes On Usuarios.id=Puntajes.idusu;
Esto me Muestra:
Id     Usuario  Tiposeleccion      id   Idusu Puntajes
1         Yo             2          1      1      500
1         Yo             2          4      1      600
1         Yo             2          5      1      550
2         El             1         null   null    null
3         Ella           2          2      3      200
3         Ella           2          6      3      900
4...      Ellos          3          3      4      150

Pero yo quiero que me devuelva los Puntaje.Id mas grandes por cada usuario que exista, ejemplo en este caso seria:

Id     Usuario  Tiposeleccion      id   Idusu Puntajes
1         Yo             2          5      1      550
2         El             1         null   null    null
3         Ella           2          6      3      900
4...      Ellos          3          3      4      150


Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 08 May 2007 06:52 pm
york3rs creo que tu forma de explicarte y los nombres de los campos no ayudan mucho a nuestro entendimiento...

No entiendo si quieres el Id de la tabla Usuarios o el id de Puntajes :crap: o si quieres el puntaje mayor o el último puntaje... acabo de leer todo lo que has posteado aquí y quedé super confundida con tu necesidad :wtf:

york3rs escribió:

Pero yo quiero que me puedes el Puntaje.Idusu mas grande por usuario solamente y no se como hacerlo

york3rs escribió:


Lo que yo quiero que me devuelva es el último puntaje que haya sacado ese jugador, no el más grande.-

york3rs escribió:

Pero solo me devuelve el id mayor, no el puntaje mayor

york3rs escribió:

Pero yo quiero que me devuelva los Puntaje.Id mas grandes por cada usuario que exista



york3rs escribió:

Yo al principio del post puse este mensaje, en el cual muestra super bien que lo que quiero que me devuelva el ultimo puntaje.-
:crap:

Por takag

637 de clabLevel



Genero:Femenino  

Informática-Cocinera-Catlover

firefox
Citar            
MensajeEscrito el 09 May 2007 08:03 pm
Ya no importa ya encontre otra solucion parche que me solucion todo y funciona bien.
Ya no se como explicar, parese que estoy en Marte :S
Tengo usuarios en una tabla en otra tengo un historial de los puntajes que han sacado los usuarios y lo que necesito obtener es el ultimos puntaje que ha sacado cara usuario.
Ej

Código :

Idusuario NombreUsuario
1...               Nicolas  

IdPuntaje Idusuario PuntajesUsuarios
1               1                900
2               1               1200
3               1               3510
4               1                 50
6               1               1000

yo quiero que la respuesta me de:
Idusuario NombreUsuario   PuntajesUsuario
1            Nicolas               1000

No creo que sea tan dificil, tengo varias ideas por el momento que no he probado... ya que estoy haciendo otras partes de la pagina por el momento.-


Gracias de todas maneras por su atencion, yo se que es dificil intentar dar respuesta a algo si no se esta claro.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 09 May 2007 08:14 pm
takag: Yo en todo el Post me he referido al puntaje.Id mas grande o al puntaje.puntaje ultimo.- si te fijas bien el Puntaje.id es autoincrementable osea si yo ingreso un puntaje ahora ese puntaje va a tener un id mas grande que los anteriores.- por ello de esta manera podria obtener el ultimo puntaje.-

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 09 May 2007 09:25 pm
york3rs prueba este, tengo la duda si usu.idusu, esta dentro del scope del SQL anidado, si es así, te va a funcionar de forma perfecta:

Código :

SELECT pu.idusu, nombre, apellido, mail, pu.PuntajesUsuario
FROM Usuarios AS usu
WHERE usu.idusu = (SELECT pu.idusu FROM Puntajes AS pu WHERE pu.idusu = usu.idusu GROUP BY pu.id DESC LIMIT 0,1)

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

firefox
Citar            
MensajeEscrito el 09 May 2007 09:29 pm
Entonces puedes utilizar la consulta que te di o la que te dió Dano, sustituyendo el Max(pu.puntajes) por Max(pu.id)

Por Darel

725 de clabLevel

5 tutoriales

 

I'm a human

firefox
Citar            
MensajeEscrito el 09 May 2007 10:02 pm
Si probe modificando el de Dano pero no me resulta, me da como resultado el ultimo Id y el Primer puntaje:S

Ej,me da como resultado tomando en cuenta lo que escribi arriba:

Código :

Idusuario NombreUsuario IdPuntaje  PuntajesUsuario
1            Nicolas          6            9000

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 10 May 2007 02:37 am
Hagamos algo.

Publica tus tablas(en sql con CREATE TABLE), publica el SQL que hiciste moviendo el mío, y te lo arreglamos aqui.

saludos

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

clabbrowser
Citar            
MensajeEscrito el 10 May 2007 07:20 pm
Aca les dejo todo lo pedido:

Código :


#
# Estructura de tabla para la tabla `puntajes`
#

CREATE TABLE puntajes (
  Idpuntaje int(5) unsigned NOT NULL auto_increment,
  Idusuario int(5) unsigned NOT NULL default '0',
  Puntaje int(6) NOT NULL default '0',
  PRIMARY KEY  (Idpuntaje)
) TYPE=MyISAM;
# --------------------------------------------------------

#
# Estructura de tabla para la tabla `usuario`
#

CREATE TABLE usuario (
  Idusuario int(5) unsigned NOT NULL auto_increment,
  nombre varchar(50) NOT NULL default '',
  Nick varchar(25) NOT NULL default '',
  PRIMARY KEY  (Idusuario)
) TYPE=MyISAM;
    
SELECT 
usuario.nombre,
max( puntajes.Idpuntaje ),
puntajes.puntaje
FROM usuario LEFT  JOIN puntajes USING ( Idusuario )  GROUP  BY usuario.Idusuario ASC 

Por york3rs

Claber

561 de clabLevel

1 tutorial

Genero:Masculino  

LA___Chile

msie
Citar            
MensajeEscrito el 11 May 2007 04:17 am
Taran taran :ninja:

Código :

SELECT usu.Idusuario, nombre,  pu.Puntaje
FROM Usuario AS usu
LEFT JOIN Puntajes  AS pu
Using (Idusuario)
WHERE 
pu.Idpuntaje = (SELECT MAX(pu.Idpuntaje) AS puntaje
         FROM Puntajes AS pu WHERE pu.Idusuario = usu.Idusuario )
OR pu.Idpuntaje is NULL
GROUP BY usu.Idusuario

Por Dano

BOFH

4273 de clabLevel

14 tutoriales
4 articulos
10 ejemplos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Lugar estratégico para vigilarte

clabbrowser

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.