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

[SOLUCIONADO] filtrar resultados de base de datos

Estas en el tema de filtrar resultados de base de datos en el foro de Bases de Datos General en Foros del Web. Hola que tal, tengo las siguientes tablas de una base de datos Y el siguiente query: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código sql: Ver original SELECT alumno . ...
  #1 (permalink)  
Antiguo 09/04/2017, 22:04
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 15 años, 3 meses
Puntos: 5
filtrar resultados de base de datos

Hola que tal, tengo las siguientes tablas de una base de datos




Y el siguiente query:

Código sql:
Ver original
  1. SELECT alumno.registro, alumno.nombre FROM alumno INNER JOIN asistencias ON alumno.RFID = asistencias.RFID WHERE asistencias.fecha = '" + _fecha + "'"

La función del programa es seleccionar una fecha con un dateTimePicker y mostrar las asistencias del día seleccionado en un dataGridView como se muestra en la siguiente imagen:



La sentencia sql que tengo solo se muestran las asistencias del día, y lo siguiente que quiero hacer es mostrar toda la lista de alumnos, buscar si tiene asistencia ese día y agregar una nueva columna llamada asistencia y poner si o no dependiendo la asistencia.

Lo de agregar la nueva columna lo hice con el siguiente código:

Código sql:
Ver original
  1. SELECT alumno.registro, alumno.nombre, IF(asistencias.fecha = '" + _fecha + "', 'Si', 'No') AS asistencia FROM alumno INNER JOIN asistencias ON alumno.RFID = asistencias.RFID WHERE asistencias.fecha = '" + _fecha + "'

Y devuelve lo siguiente:



Mi pregunta es, ¿como puedo hacer para mostrar también los alumnos que no tienes asistencia, y en la columna con el alias asistencia ponerles No?

Espero que me puedan ayudar con este problema.

Saludos y gracias de antemano
  #2 (permalink)  
Antiguo 10/04/2017, 07:21
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: filtrar resultados de base de datos

En lugar de inner join usa left join, te llevaras una bella sorpresa
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 10/04/2017, 08:31
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: filtrar resultados de base de datos

Un poco mas legible:
Código SQL:
Ver original
  1. SELECT
  2.     al.registro,
  3.     al.nombre,
  4.     IF(asi.fecha = DATE('" + _fecha + "'), 'Si', 'No') asistencia
  5. FROM
  6.     alumno al
  7.     INNER JOIN asistencias asi ON al.RFID = asi.RFID
  8. WHERE asi.fecha = DATE('" + _fecha + "') OR asi.fecha IS NULL
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 10/04/2017, 13:41
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: filtrar resultados de base de datos

Hola que tal Libras, utilizando el left join me regresa los mismos resultados que si uno el inner join, no estoy en mi computadora personal, pero haciendo pruebas en esta pagina comprobe los resultados http://sqlfiddle.com/#!9/085331/4

Saludos

Última edición por WinderJerter; 10/04/2017 a las 14:08
  #5 (permalink)  
Antiguo 10/04/2017, 14:10
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: filtrar resultados de base de datos

Tu error esta en el where, en el ejemplo que tienes todos los registros tienen una fecha, por lo que al poner en el where

Código MySQL:
Ver original
  1. where fecha='mi fecha' or fecha is null

Entonces nada mas te va a regresar los registros que tengan esa fecha, prueba a hacer el query pero quitando el where(la condicion ya la tienes en el IF) algo como esto:

Código MySQL:
Ver original
  1. SELECT alumno.registro, alumno.nombre,
  2. IF(asistencias.fecha = '2013-10-03', 'Si', 'No') AS asistencia
  3. FROM alumno
  4. left JOIN asistencias ON
  5. alumno.RFID = asistencias.RFID
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #6 (permalink)  
Antiguo 10/04/2017, 14:41
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: filtrar resultados de base de datos

Hola, suponiendo que estas son mis tablas

Código:
INSERT INTO alumno
	(`id_alumno`, `rfid`, `nombre`, `registro`)
VALUES
	(1, 'weweerer', 'javier', '13110287'),
	(2, 'errtrt', 'juan', '3454345'),
	(3, '34wer', 'alex', '34332111')
;

INSERT INTO asistencias
	(`rfid`, `fecha`)
VALUES
	('weweerer', '2013-10-03'),
	('errtrt', '2013-10-03'),
	('34wer', '2013-10-03'),
    ('errtrt', '2013-10-02'),
	('34wer', '2013-10-02')
;
Al quitar el where y buscar las asistencias del día 2"013-10-02" me devuelve lo siguiente:

Código:
registro  |	nombre	| asistencia
------------------------------------
13110287  |	javier  |	No
3454345   |     juan    |	No
34332111  |	alex	|       No
3454345	  |     juan	|       Si
34332111  |	alex	|       Si
Lo que quiero hacer es que me muestre los nombres y registros de los alumnos que si asistieron y que la lista se complete con los alumnos que no asistieron, por ejemplo así:

Código:
registro  |	nombre	| asistencia
------------------------------------
13110287  |	javier  |	No
3454345	  |     juan	|       Si
34332111  |	alex	|       Si
Espero que me puedas ayudar con ese problema

Saludos y buen dia
  #7 (permalink)  
Antiguo 10/04/2017, 15:01
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: filtrar resultados de base de datos

Algo como esto:



Código MySQL:
Ver original
  1. select case when asistencia is null then 'No' else Asistencia end as asistencia, a1.nombre,a1.rfid from #alumno as a1
  2. select t1.nombre, 'Si' as asistencia, t1.rfid from #alumno as t1
  3. right join #asistencias as t2 on (t1.rfid=t2.rfid)
  4. where fecha='2013-10-03 00:00:00.000'
  5. ) as a2 on (a1.rfid=a2.rfid)

P.D: El query es con sintaxis de sql server, no se si aplicaria la misma sintaxis para MYSQL
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #8 (permalink)  
Antiguo 10/04/2017, 15:24
 
Fecha de Ingreso: agosto-2009
Mensajes: 292
Antigüedad: 15 años, 3 meses
Puntos: 5
Respuesta: filtrar resultados de base de datos

Cita:
Iniciado por Libras Ver Mensaje
Algo como esto:



Código MySQL:
Ver original
  1. select case when asistencia is null then 'No' else Asistencia end as asistencia, a1.nombre,a1.rfid from #alumno as a1
  2. select t1.nombre, 'Si' as asistencia, t1.rfid from #alumno as t1
  3. right join #asistencias as t2 on (t1.rfid=t2.rfid)
  4. where fecha='2013-10-03 00:00:00.000'
  5. ) as a2 on (a1.rfid=a2.rfid)

P.D: El query es con sintaxis de sql server, no se si aplicaria la misma sintaxis para MYSQL
Muchas gracias Libras así era , la sintaxis es igual a excepción que no lleva el #. Muchas gracias.

Saludos
  #9 (permalink)  
Antiguo 10/04/2017, 15:27
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 18 años, 3 meses
Puntos: 774
Respuesta: filtrar resultados de base de datos

Cita:
Iniciado por WinderJerter Ver Mensaje
Muchas gracias Libras así era , la sintaxis es igual a excepción que no lleva el #. Muchas gracias.

Saludos
Mi error, estaba usando tablas temporales de SQL server, que bien que te funciono
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me

Etiquetas: filtrar, resultados, sql
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 12:39.