PHP - ERROR 1242 (Subconsulta retorna más de un registro)

 
Vista:
sin imagen de perfil

ERROR 1242 (Subconsulta retorna más de un registro)

Publicado por Omar (1 intervención) el 19/08/2014 19:33:10
Estimados,

Tengo una aplicación de asistencia que de un momento a otro me arroja el mensaje siguiente:

Error en Consulta SQLUsuario1 Select tablita.IdUsuario, tablita.Nombre, .....SUBQUERY RETURNS MORE THAN 1 ROW (Codigo : ) 1242

Al verificar por BD visualizo todo normal. No encuentro el error, he buscado por foros y no puedo darle solución.

Este es el código de la consulta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
$sqlusuariol="select
 tablita.idusuario
,tablita.Nombre
,tablita.Apellidos
,tablita.DNI
,tablita.NomSucursal
,tablita.Marca
,tablita.FechaIngresoSistema
,(SELECT IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) FROM  faltapermiso where tipo=2 and IdUsuario=tablita.idusuario	AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."')) as SubsidioIncTem
,(SELECT IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) FROM  faltapermiso where tipo=3 and IdUsuario=tablita.idusuario	AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."')) as PermisoSinGoce
,(SELECT IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) FROM  faltapermiso where tipo=4 and IdUsuario=tablita.idusuario	AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."')) as PermisoConGoce
,(SELECT IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) FROM  faltapermiso where tipo=5 and IdUsuario=tablita.idusuario	AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."')) as DescansoMedico
,(SELECT IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) FROM  faltapermiso where tipo=6 and IdUsuario=tablita.idusuario	AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."')) as Suspencion
,(SELECT IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) FROM  faltapermiso where tipo=10 and IdUsuario=tablita.idusuario	AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."'))  as SubsidioPaternidad

,IFNULL((SELECT CASE WHEN '".$fechaIni."'<fechainicio THEN DATEDIFF('".$fechaFin."',fechainicio)+1 ELSE
		CASE WHEN '".$fechaIni."'>fechainicio AND '".$fechaFin."'<fechafinal THEN DATEDIFF('".$fechaFin."','".$fechaIni."')+1 ELSE
		DATEDIFF(fechafinal,'".$fechaFin."')+1 END
		END
		FROM  faltapermiso 
		where tipo=9 and IdUsuario=tablita.idusuario
		AND	('".$fechaIni."' BETWEEN fechainicio AND fechafinal OR '".$fechaFin."' BETWEEN  fechainicio AND fechafinal)),0) as SubsidioMaternidad
		
,(SELECT CASE WHEN '".$fechaIni."'>fechainicio THEN DATEDIFF(fechafinal,'".$fechaIni."')+1 ELSE CASE WHEN fechafinal>'".$fechaFin."' THEN DATEDIFF(fechafinal,'".$fechaFin."')+1 ELSE IFNULL(SUM(DATEDIFF(fechafinal,fechainicio)+1),0) END END  FROM  faltapermiso where tipo=8 and IdUsuario=tablita.idusuario AND	(fechainicio BETWEEN '".$fechaIni."' AND '".$fechaFin."' OR fechafinal BETWEEN '".$fechaIni."' AND '".$fechaFin."')) as Vacaciones

from (
SELECT DISTINCT
                u.idusuario,
                u.Nombre,
                u.Apellidos,
                u.DNI,
                s.NomSucursal,
				(case when u.MarcaTarjeta=1 then 'SI' else 'NO' end) as marca,
				u.FechaIngresoSistema
        FROM usuario u
            INNER JOIN sucursal s ON u.IdSucursal=s.IdSucursal
            INNER JOIN tarjeta t on t.IdUsuario=u.IdUsuario
        WHERE  1=1
		and u.IdTipoUsuario=1
        AND t.fecha BETWEEN '".$fechaIni."' AND '".$fechaFin."'
        
UNION    
		
SELECT  u.idusuario,
                u.Nombre,
                u.Apellidos,
                u.DNI,
                s.NomSucursal,
				(case when u.MarcaTarjeta=1 then 'SI' else 'NO' end) as marca,
				u.FechaIngresoSistema
FROM usuario u
INNER JOIN sucursal s ON u.IdSucursal=s.IdSucursal
WHERE 1=1
and u.IdTipoUsuario=1
and fecbaja is null
and IdUsuario not in (
               SELECT u.IdUsuario
               FROM usuario u
               INNER JOIN tarjeta t on t.IdUsuario=u.IdUsuario
               WHERE  1=1
               AND t.fecha BETWEEN '".$fechaIni."' AND '".$fechaFin."'
               GROUP BY u.idusuario 
               )

) tablita

ORDER BY tablita.Apellidos
";

También adjunto la programación de dicha aplicación para ver si me pudieran brindar alguna solución.

Gracias
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
Imágen de perfil de Vainas
Val: 34
Ha aumentado su posición en 3 puestos en PHP (en relación al último mes)
Gráfica de PHP

ERROR 1242 (Subconsulta retorna más de un registro)

Publicado por Vainas (262 intervenciones) el 19/08/2014 19:52:34
Buenas:

Buff vaya consulta mas larga....

has probado hacer un echo de la misma y tomar ese valor y probarlo en phpmyadmin o con algun programa para ejecutar las consultas?.

Igual podriamos lograr que nos de algun punto donde puede estar el error. Ademas que esto tiene mas pinta de ser SQL que PHP.

Como tienes consultas anidadas te esta diciendo que una de ellas desvuelve o mas columnas de las que necesita o mas filas.

Espero que sirva de algo. Saludos.
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
Imágen de perfil de xve
Val: 3.943
Oro
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

ERROR 1242 (Subconsulta retorna más de un registro)

Publicado por xve (6935 intervenciones) el 20/08/2014 09:11:29
Hola Omar, ese error que te da, es porque alguna de las subconsultas que haces, devuelve mas de un resultado, y solo puede devolver uno.

Lo he estado mirando, y no he sabido ver donde, pero si ejecutas una a una las subconsultas, veras que te devolverá mas de un registro cuando solo tiene que devolver uno.

Coméntanos, ok?
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