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

Combinando 2 selects

Estas en el tema de Combinando 2 selects en el foro de Mysql en Foros del Web. Hola amigos, Quisiera saber si es posible un SELECT en el área de definición de campos... algo parecido a SELECT `nombre`,`puesto`,`tipouser`, (SELECT * FROM `permisos`) ...
  #1 (permalink)  
Antiguo 05/02/2011, 13:29
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 4 meses
Puntos: 0
Combinando 2 selects

Hola amigos,

Quisiera saber si es posible un SELECT en el área de definición de campos... algo parecido a SELECT `nombre`,`puesto`,`tipouser`, (SELECT * FROM `permisos`) AS `permisos` FROM `usuarios`;

Es que los datos de un usuario los obtengo de varias tablas y los permisos de su 'tipo de usuario' los obtengo de otras y necesito que todo salga en un mismo SELECT pues se carga directo a un JsonStore de una Grid en ExtJS.

Aquí el ejemplo de cómo lo obtengo hoy por separado... pero así no me sirve, lo necesito juntar... no sé si con UNION o 2 SELECTS, no sé...

Código PHP:
// un usuario es de un tipo, y ese tipo tiene determinados niveles de acceso
$strSQL 'SELECT a.access FROM `users` u 
LEFT JOIN `usertypes` ut ON ut.`idusertype` = u.`usertypeid` 
LEFT JOIN `types_access` ta ON ta.`usertypeid` = ut.`idusertype` 
LEFT JOIN `access` a ON a.`idaccess` = ta.`accessid` 
WHERE u.`iduser` = '
.intval($theid); 
$access Db::getInstance()->Query($strSQL); // metodo de la clase Db que se conecta y consulta la query

// un usuario es de un tipo y pertenece a una compañía
$strSQL 'SELECT u.`iduser`, u.`fullname`, u.`gender`, c.`company`, u.`email`, u.`phone`, ut.`usertype` 
FROM `users` u 
LEFT JOIN `companies` c ON c.`idcompany` = u.`companyid`  
LEFT JOIN `usertypes` ut ON ut.`idusertype` = u.`usertypeid` 
WHERE u.`iduser` = '
.intval($theid);
$data Db::getInstance()->Query($strSQL);

$result = array($access$data);
return 
$result
Saludos y gracias por adelantado,
Silver
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #2 (permalink)  
Antiguo 06/02/2011, 17:11
 
Fecha de Ingreso: enero-2010
Ubicación: Estelí, Nicaragua
Mensajes: 157
Antigüedad: 14 años, 3 meses
Puntos: 8
Respuesta: Combinando 2 selects

hola, esa consulta no es posible ya no se puede regresar mas de un valor, por otro lado si la cambias a regresar un solo campo puede funcionar..
Código MySQL:
Ver original
  1. select campo1,campo2,(select campo3 from tabla2) as campo3 from tabla1


saludos
  #3 (permalink)  
Antiguo 07/02/2011, 00:08
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 4 meses
Puntos: 0
Respuesta: Combinando 2 selects

Hola Lenincasco,
Gracias por el mensaje.
La información del usuario es un solo record (con varios campos), pero los accesos son más de 50... por eso es que no los he podido combinar en un SELECT, porque uno de los SELECT devuelve más de un valor... otra manera puede ser crear una cadena con todos los accesos y separarla por "|", pero tampoco sé como lograrlo en un solo SELECT.
La query debería generar algo así:
Código PHP:
{iduser:15fullname:'juan perez'gender:'M', ......, 
access'editUser|createUser|printReport'
Pero como la información viene de tablas diferentes hay que combinar los dos SELECT...
¿Alguna ayudita?
Gracias!!!!!
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #4 (permalink)  
Antiguo 07/02/2011, 01:54
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Combinando 2 selects

para eso usa group_concat(access SEPARATOR '|') con GROUP BY el iduser
echa un vistazo al manual. Yo uniría con INNER JOIN primero el iduser y el access, y luego haría a su alrededor los LEFT JOIN que necesitara. Polr cierto, no sé por qué usas LEFT JOIN en la consulta de accesos; creo que no es necesario. No he probado nada, pero esa es la idea.

Código MySQL:
Ver original
  1. SELECT t1.accesos, u.`iduser`, u.`fullname`, u.`gender`, c.`company`, u.`email`, u.`phone`, ut.`usertype`  
  2. FROM `users` u INNER JOIN (SELECT us.iduser, GROUP_CONCAT(a.access SEPARATOR '|') accesos FROM `users` us  
  3. INNER JOIN `usertypes` ut ON ut.`idusertype` = u.`usertypeid`  
  4. INNER JOIN `types_access` ta ON ta.`usertypeid` = ut.`idusertype`  
  5. INNER JOIN `access` a ON a.`idaccess` = ta.`accessid`  
  6. WHERE u.`iduser` = @id) GROUP BY u.iduser)t1 ON u.iduser = us.iduser LEFT JOIN `companies` c ON c.`idcompany` = u.`companyid`  
  7. LEFT JOIN `usertypes` ut ON ut.`idusertype` = u.`usertypeid`  
  8. WHERE u.`iduser` = @id;

Última edición por jurena; 07/02/2011 a las 02:04
  #5 (permalink)  
Antiguo 07/02/2011, 13:25
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 4 meses
Puntos: 0
Respuesta: Combinando 2 selects

Hola Jurena,

Gracias por la atenta respuesta.
Estoy probando el código tal cual me copiaste y recibo el error:
Código PHP:
#1248 - Every derived table must have its own alias 
Estuve buscando información de este error y tiene que ver con la clausula AS, pero en varias pruebas me sigue dando el error.
¿Qué puede ser?

Saludos!!!!!!
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx
  #6 (permalink)  
Antiguo 07/02/2011, 15:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Combinando 2 selects

Creo que simplemente sobraba un paréntesis. No he probado nada.

SELECT t1.accesos, u.`iduser`, u.`fullname`, u.`gender`, c.`company`, u.`email`, u.`phone`, ut.`usertype`
FROM `users` u INNER JOIN (SELECT us.iduser, GROUP_CONCAT(a.access SEPARATOR '|') accesos FROM `users` us
INNER JOIN `usertypes` ut ON ut.`idusertype` = u.`usertypeid`
INNER JOIN `types_access` ta ON ta.`usertypeid` = ut.`idusertype`
INNER JOIN `access` a ON a.`idaccess` = ta.`accessid`
WHERE u.`iduser` = @id GROUP BY u.iduser)t1 ON u.iduser = us.iduser LEFT JOIN `companies` c ON c.`idcompany` = u.`companyid`
LEFT JOIN `usertypes` ut ON ut.`idusertype` = u.`usertypeid`
WHERE u.`iduser` = @id;

Última edición por jurena; 08/02/2011 a las 01:47
  #7 (permalink)  
Antiguo 07/02/2011, 16:01
 
Fecha de Ingreso: noviembre-2001
Ubicación: México DF
Mensajes: 128
Antigüedad: 22 años, 4 meses
Puntos: 0
Respuesta: Combinando 2 selects

Hola amigo,

Gracias por la ayuda... finalmente quedó resuelto de la siguiente manera:

Código PHP:
SELECT u.fullnamec.company, ......, GROUP_CONCATa.`access
SEPARATOR '|' access
FROM 
`usersu
INNER JOIN 
`usertypesut ON ut.`idusertype` = u.`usertypeid
INNER JOIN `companiesc ON c.`idcompany` = u.`companyid
INNER JOIN `types_accessta ON ta.`usertypeid` = ut.`idusertype
INNER JOIN `accessa ON a.`idaccess` = ta.`accessid
WHERE u.`iduser` =1
Saludos!!!
__________________
Nuedi Servicios SA de CV
http://www.nuedi.mx

Etiquetas: selects
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 08:24.