MySQL - MySQL

   
Vista:

MySQL

Publicado por julio (1 intervención) el 07/12/2009 17:15:44
Como puedo trabajar con Select anidados en MySQL

por favor enviar algun ejemplo de ello

Gracias por todo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:MySQL

Publicado por Gonzalo GC (339 intervenciones) el 07/12/2009 17:23:19
Puedes trabajar con ellos de la misma forma que con cualquier otro DBMS.
Yo tengo ejemplos que implican 8 subconsultas simultáneas, algunas de ellas con anidamientos de 3 niveles. Y funcionan sin problemas.
Sería más fácil si nos dijeses qué es lo que has intentado y qué es lo que te causó problemas.

Esto, por ejemplo, es un INSERT que se obtiene en una consulta, la cual opera dentro de un stored procedure:

INSERT INTO ESTADISTICACHOFER
SELECT
DATE(NOW()) FECHA,
DATE(FDESDE),
DATE(FHASTA),
TIME(FDESDE),
TIME(FHASTA),
CHOFER_ID,
TT_CONDUCCION,
KMS,
(((TIMESTAMPDIFF(DAY, FDESDE, FHASTA)+1)* 86400)-TT_CONDUCCION) TT_DESCANSO,
IFNULL(TEXCESORALENTI, 0),
IFNULL(TT_RALENTI, 0),
IFNULL(TREMOLCADO, 0),
IFNULL(TT_REMOLCADO, 0),
IFNULL(TEXCCONDDIA, 0),
IFNULL(TT_EXCCONDDIA, 0),
IFNULL(TEXCVELOC, 0),
IFNULL(TT_EXCVELOC, 0),
IFNULL(TSINDESCANSO, 0),
IFNULL(TFRENBRUSCA, 0),
IFNULL(TACELBRUSCA, 0),
IFNULL(TDESCONEXION, 0),
IFNULL(TT_DESCONEXION, 0),
IFNULL(TDESCONEXCAUDAL, 0),
IFNULL(TT_DESCONEXCAUDAL, 0),
IFNULL(TEXCESORPM, 0),
IFNULL(TT_EXCESORPM, 0),
IFNULL(TEXCESOTEMP, 0),
IFNULL(TTEXCESOTEMP, 0),
'N' ,
IFNULL(TINFRACCION, 0),
IFNULL(TINFRACCIONT, 0),
((TIMESTAMPDIFF(DAY, FDESDE, FHASTA)+1)- DIA) ,
FLISTA,
IFNULL(TFUERAHORA, 0),
IF(VCOEF>1,
FN_PUNTAJE(
(IFNULL(TACELBRUSCA, 0) DIV ((KMS DIV VCOEF)+1)),
(IFNULL(TEXCESORPM, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TEXCESOTEMP, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TEXCESORALENTI, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TSINDESCANSO, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TFUERAHORA, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TEXCCONDDIA, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TDESCONEXCAUDAL, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TEXCVELOC, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TINFRACCION, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TDESCONEXION, 0) DIV ((KMS DIV VCOEF) + 1)),
(IFNULL(TFRENBRUSCA, 0) DIV ((KMS DIV VCOEF) + 1)),
FLISTA),
FN_PUNTAJE(
IFNULL(TACELBRUSCA, 0),
IFNULL(TEXCESORPM, 0),
IFNULL(TEXCESOTEMP, 0),
IFNULL(TEXCESORALENTI, 0),
IFNULL(TSINDESCANSO, 0),
IFNULL(TFUERAHORA, 0),
IFNULL(TEXCCONDDIA, 0),
IFNULL(TDESCONEXCAUDAL, 0),
IFNULL(TEXCVELOC, 0),
IFNULL(TINFRACCION, 0),
IFNULL(TDESCONEXION, 0),
IFNULL(TFRENBRUSCA, 0),
FLISTA))PUNTAJE,
IFNULL(LITROSMARCHA,0) ,
IFNULL(LITROSRALENTI,0) ,
FRANGO,
SUBSTRING_INDEX(USER(),'@',1)
FROM (
SELECT CHOFER_ID, COUNT(DISTINCT DATE(DESDE)) DIA, SUM(KMRECORRIDOS) KMS, SUM(TIMESTAMPDIFF(SECOND,DESDE, HASTA)+10) TT_CONDUCCION
FROM CONDUCCION INNER JOIN CONDUCTORES USING(CHOFER_ID)
WHERE
USER_NAME = SUBSTRING_INDEX(USER(),'@',1) AND
(DATE(DESDE) BETWEEN DATE(FDESDE) AND DATE(FHASTA)) AND
(TIME(DESDE) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA)) AND (TIME(HASTA) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA))
GROUP BY CHOFER_ID
UNION
SELECT CHOFER_ID, 0 DIA, SUM((VELOCIDAD/3600)*SAMPLING) KMS, SUM(SAMPLING) TT_CONDUCCION
FROM TRAZA_1 INNER JOIN RESUMENTACO USING(PATENTE)
GROUP BY CHOFER_ID
) AS T1
LEFT JOIN
(
SELECT CHOFER_ID, COUNT(*) TEXCVELOC, SUM(TIMESTAMPDIFF(SECOND,DESDE, HASTA)) TT_EXCVELOC
FROM EXCESO_VELOC_CHOFER INNER JOIN CONDUCTORES USING(CHOFER_ID)
WHERE
USER_NAME = SUBSTRING_INDEX(USER(),'@',1) AND
(DATE(DESDE) BETWEEN DATE(FDESDE) AND DATE(FHASTA)) AND
(TIME(DESDE) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA)) AND (TIME(HASTA) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA))
GROUP BY CHOFER_ID
UNION
SELECT T1.CHOFER_ID, SUM(IF(T2.FECHA_DIA IS NULL, 1, 0)) TEXCVELOC, SUM(T1.T_SUP) TT_EXCVELOC
FROM
(SELECT CHOFER_ID,FECHA_DIA, VELOCIDAD, SAMPLING T_SUP
FROM TRAZA_1 INNER JOIN RESUMENTACO USING(PATENTE)
WHERE VELOCIDAD> VELMAX) T1
LEFT JOIN
(SELECT CHOFER_ID,DATE_ADD(FECHA_DIA, INTERVAL SAMPLING SECOND) FECHA_DIA, VELOCIDAD
FROM TRAZA_1 INNER JOIN RESUMENTACO USING(PATENTE)
WHERE VELOCIDAD> VELMAX) T2
USING(CHOFER_ID, FECHA_DIA)
GROUP BY CHOFER_ID
) AS T3 USING(CHOFER_ID)
LEFT JOIN (
SELECT
CHOFER_ID,
SUM(IF(CODIGO = 52,1,0)) TEXCESORALENTI,
SUM(IF(CODIGO = 52, TIMESTAMPDIFF(SECOND,DESDE, HASTA), 0)) TT_RALENTI,
SUM(IF(CODIGO = 51,1,0)) TREMOLCADO,
SUM(IF(CODIGO = 51, TIMESTAMPDIFF(SECOND,DESDE, HASTA), 0)) TT_REMOLCADO,
SUM(IF(CODIGO = 35,1,0)) TEXCCONDDIA,
SUM(IF(CODIGO = 35, TIMESTAMPDIFF(SECOND,DESDE, HASTA), 0)) TT_EXCCONDDIA,
SUM(IF(CODIGO = 33,1,0)) TSINDESCANSO,
SUM(IF(CODIGO = 3,1,0)) TFRENBRUSCA,
SUM(IF(CODIGO = 38,1,0)) TACELBRUSCA,
SUM(IF(CODIGO = 5 AND TIMESTAMPDIFF(SECOND,DESDE, HASTA)>10, 1, 0)) TDESCONEXION,
SUM(IF(CODIGO = 5 AND TIMESTAMPDIFF(SECOND,DESDE, HASTA)>10, TIMESTAMPDIFF(SECOND,DESDE, HASTA), 0)) TT_DESCONEXION,
SUM(IF(CODIGO = 28 AND TIMESTAMPDIFF(SECOND,DESDE, HASTA)>10, 1, 0)) TDESCONEXCAUDAL,
SUM(IF(CODIGO = 28 AND TIMESTAMPDIFF(SECOND,DESDE, HASTA)>10, TIMESTAMPDIFF(SECOND,DESDE, HASTA),0)) TT_DESCONEXCAUDAL,
SUM(IF(CODIGO = 9,1,0)) TEXCESORPM,
SUM(IF(CODIGO = 9, TIMESTAMPDIFF(SECOND,DESDE, HASTA), 0)) TT_EXCESORPM,
SUM(IF(CODIGO = 18,1,0)) TEXCESOTEMP,
SUM(IF(CODIGO = 18, TIMESTAMPDIFF(SECOND,DESDE, HASTA),0)) TTEXCESOTEMP,
SUM(IF(CODIGO = 1,1,0)) TINFRACCION,
SUM(IF(CODIGO = 1, TIMESTAMPDIFF(SECOND,DESDE, HASTA), 0)) TINFRACCIONT,
SUM(IF(CODIGO = 34,1,0)) TFUERAHORA
FROM
(
SELECT CHOFER_ID, CODIGO, DESDE, HASTA
FROM TIEMPO_INFRACCIONES_CHOFER INNER JOIN CONDUCTORES USING(CHOFER_ID)
WHERE
USER_NAME = SUBSTRING_INDEX(USER(),'@',1) AND
CODIGO IN(1, 3, 5, 9, 18, 33, 34, 35, 51, 52, 38) AND
(DATE(DESDE) BETWEEN DATE(FDESDE) AND DATE(FHASTA)) AND
(TIME(DESDE) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA)) AND (TIME(HASTA) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA))
UNION
SELECT CHOFER_ID, CODIGO, DESDE, ADDTIME(DATE(HASTA),TIME(FHASTA)) HASTA
FROM TIEMPO_INFRACCIONES_CHOFER INNER JOIN CONDUCTORES USING(CHOFER_ID)
WHERE
USER_NAME = SUBSTRING_INDEX(USER(),'@',1) AND
CODIGO IN(1, 3, 5, 9, 18, 33, 34, 35, 51, 52, 38) AND
(DATE(DESDE) BETWEEN DATE(FDESDE) AND DATE(FHASTA)) AND
(TIME(DESDE) < TIME(FDESDE) AND TIME(HASTA) > TIME(FDESDE))
UNION
SELECT CHOFER_ID, CODIGO, ADDTIME(DATE(DESDE),TIME(FDESDE)) DESDE, HASTA
FROM TIEMPO_INFRACCIONES_CHOFER INNER JOIN CONDUCTORES USING(CHOFER_ID)
WHERE
USER_NAME = SUBSTRING_INDEX(USER(),'@',1) AND
CODIGO IN(1, 3, 5, 9, 18, 33, 34, 35, 51, 52, 38) AND
(DATE(DESDE) BETWEEN DATE(FDESDE) AND DATE(FHASTA)) AND
(TIME(DESDE) < TIME(FHASTA) AND TIME(HASTA) > TIME(FHASTA))
) T
GROUP BY CHOFER_ID) T6 USING(CHOFER_ID)
LEFT JOIN (
SELECT CHOFER_ID, SUM(IF(CODIGO=245,0.5,0)) LITROSMARCHA, SUM(IF(CODIGO=246,0.5,0)) LITROSRALENTI
FROM CONSUMO_VEHICULO INNER JOIN CONDUCTORES USING(CHOFER_ID)
WHERE
USER_NAME = SUBSTRING_INDEX(USER(),'@',1) AND
(DATE(FDESDE) = DATE(FECHA_HORA)) AND (TIME(FECHA_HORA) NOT BETWEEN TIME(FDESDE) AND TIME(FHASTA))
GROUP BY CHOFER_ID
) AS CONSUMO USING (CHOFER_ID)
GROUP BY CHOFER_ID;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:MySQL

Publicado por Gonzalo GC (339 intervenciones) el 07/12/2009 17:31:34
¿Contaste cuantos anidamientos tiene?
Bueno, la respuesta de prestaciones de 400 conductores en 6 meses de trabajo tarda 1.8 segundos de promedio...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar