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

Problema con subquery

Estas en el tema de Problema con subquery en el foro de Mysql en Foros del Web. Hola, Aprovechando la capacidad interrelacional de las bases de datos cree dos tablas, una llama paises que contiene un Id y el nombre de los ...
  #1 (permalink)  
Antiguo 10/05/2006, 09:19
 
Fecha de Ingreso: mayo-2006
Mensajes: 3
Antigüedad: 18 años, 6 meses
Puntos: 0
Problema con subquery

Hola,

Aprovechando la capacidad interrelacional de las bases de datos cree dos tablas, una llama paises que contiene un Id y el nombre de los paises

CREATE TABLE paises(
id INT(11) UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
pais VARCHAR(100) NOT NULL DEFAULT ''
);

La otra tabla es:

CREATE TABLE usuarios(
paisid INT(3) NOT NULL DEFAULT 0,
apellido VARCHAR(60) NOT NULL DEFAULT ''
);

En la tabla usuarios, ingreso en vez del nombre del pais, solo el id, el problema me surge cuando quiero recuperar la información, y cuando quiero ordenarla según el pais, ya que si consulto directamente me devolvería el ID y no el nombre del pais, por esto hago un subquery:

SELECT apellido,(SELECT pais FROM paises WHERE paises.id=paisid) AS nombrepais FROM usuarios ORDER BY nombrepais ASC;

Aparentemente el subquery se ejecuta una sola vez, inclusive utilizando SQL_NO_CACHE, probablemente esto sea así pero alguien conoce una solucion, es un programa en PHP.

O se le ha planteado un problema parecido, debo hacer si o si todo en una consulta porque sino no podre ordenarla, no?

Saludos y Muchas, Gracias
  #2 (permalink)  
Antiguo 10/05/2006, 10:36
Avatar de PequeñoMauro  
Fecha de Ingreso: abril-2006
Ubicación: Lima - Perú
Mensajes: 600
Antigüedad: 18 años, 7 meses
Puntos: 3
Dependiendo de la versión no podrás usar subconsultas. No se si te saldrá de esta manera:

SELECT apellido,pais
FROM paises p INNER JOIN usuarios u ON (u.paisid = p.id)

Es mejor que lo realices mediante un join entre ambas tablas, solo te va a salir cuando los dos id sean similares. Te digo esto por que veo que los id de cada tabla tienen diferente tamaño.

Si gustas puedes verificar esta página:
http://dev.mysql.com/doc/refman/5.0/en/join.html

Saludos.....
__________________
"Nada en mis manos traigo tan solo a tu cruz me aferro....."
  #3 (permalink)  
Antiguo 10/05/2006, 11:10
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
Select paises.pais, usuarios.Apellido
from usuarios, paises
Where usuarios.paisid = paises.id
Order by paises.pais;
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #4 (permalink)  
Antiguo 10/05/2006, 14:37
 
Fecha de Ingreso: mayo-2006
Mensajes: 3
Antigüedad: 18 años, 6 meses
Puntos: 0
Hola agradesco la ayuda, la solución de Linterns es ingeniosa pero como tengo más campos, del mismo tipo relacional, solo puse dos por sintesis no creo que me sea útil, igualmente voy a probar con JOIN (creo que es la solución) y despues les comento.

Como comentario es verdad q los subquerys estan definidas como para la version 5 pero yo tengo la 4.1 y me funciona perfecto.

Agradecido, Saludos
  #5 (permalink)  
Antiguo 10/05/2006, 14:59
Avatar de Linterns
Colaborador
 
Fecha de Ingreso: diciembre-2001
Mensajes: 2.799
Antigüedad: 22 años, 11 meses
Puntos: 11
en la parte de SELECT puede sponer la cantidad de CAmpos que quieras y no cambia la sintaxis. En el FROM las dos tablas que necesitas y en el WHERE la parta "usuarios.paisid = paises.id" es simplemente es la llave foranea de una tabla a otra por lo que te sirve para cualquier cantidas de campos que necesites.

Una llamada a una llave foranea es mas eficiente que un INNER JOIN no asi a un LEFT JOIN
__________________
Bien se puede recibir una puñalada sin adulación,
pero rara vez se recibe una adulación sin puñalada
** ***
  #6 (permalink)  
Antiguo 11/05/2006, 17:19
 
Fecha de Ingreso: mayo-2006
Mensajes: 3
Antigüedad: 18 años, 6 meses
Puntos: 0
Ay, postie una respuesta larga, explicativa y la porqueria esta se deslogeo, bueno les paso la parte resumida.

Te agradesco la preocupación Linterns pero necesito el where para hacer otras consultas, al final la solución vino así:

SELECT apellido, pais FROM usuarios JOIN paises ON paisid=id WHERE apellido LIKE 'perez';

lo importante en este caso es:

JOIN: junta todo los campos de ambas tabla.
ON: permite juntar solo las filas que coincidan con la condición pasada.

efectivamente al INT(11) de paises debería ser INT(3) ya que solo hay 200 y pico de países, disculpen lo escueto pero quiero q se postee.

Gracias
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 13:59.