Cómo consultar dos tablas mysql y obtener resultados que no están en ambas tablas o cumplen la condición especificada

Tengo dos mesas

tabla de usuario

 user_id | name  |
    1    | peter |
    2    | kofi  |
    3    | sam   |
    4    | nasah |
    5    | sarah |
    6    | david |
    7    | dan   |

horario

 time_id | user_id | register
    1    |     1   |  present
    2    |     2   |  absent
    3    |     3   |  absent
    4    |     4   |  present
    5    |     5   |  absent

en la tabla "tiempo" en la columna "registro", el usuario puede registrar "presente" o "ausente" cuando inicia sesión en el sistema.

Quiero una consulta mysql que seleccione usuarios que se hayan registrado como "ausentes" o que no se hayan registrado en absoluto.

el resultado devuelto debe ser

kofi  | absent
sam   | absent
sarah | absent
david | 
dan   | 

preguntado el 12 de junio de 12 a las 15:06

No entiendo su relación entre tablas... ¿user_id es un PK y user_id es un FK con diferente tipo de var? -

@ jcho360 Tiene razón, las claves y las relaciones no están configuradas correctamente entre estas tablas. Sin embargo, puede obtener los datos que el OP quiere usando su estructura, y también puede obtenerlos si arregla las tablas (he mostrado ambas formas en mi respuesta):

por favor revisa mi respuesta... está funcionando. También se proporciona un enlace con la prueba... -

2 Respuestas

Que pasa con esto

SELECT t2.name, t1.register 
FROM time t1
RIGHT JOIN user t2
ON t2.user_id=t1.user_id
WHERE (t1.register = 'absent' OR t1.register is null)

Está funcionando, probado aquí.


actualización 1

Según su conversación, desea filtrar más según la hora/fecha

digamos que quiero averiguar quiénes estuvieron ausentes o no ingresaron al sistema antes del 06-13-12, suponiendo que haya una columna con el nombre "fecha" en el horario

Utilice la siguiente consulta

SELECT t2.name, t1.register, t1.mydate 
FROM time t1
RIGHT JOIN user t2
ON t2.user_id=t1.user_id
WHERE 
     (t1.register = 'absent' OR t1.register is null)
     AND
     (t1.mydate <= '2012-06-13' OR t1.mydate is null)

Aquí hay una demostración para el nuevo requisito.


Espero que esto sea lo que querías.

Respondido el 12 de junio de 12 a las 20:06

lo siento, he reestructurado mi pregunta. cometí un error en mi segunda tabla, en realidad era la identificación de los usuarios de la tabla 1. gracias por su rápida respuesta. - David Addoteye

+1, después de ver su respuesta, me di cuenta de que no entendí bien la pregunta de OP (sin embargo, la consulta que di funcionó). De todos modos, eliminé mi respuesta, pero tal vez podría agregar la parte que tenía sobre arreglar el user_id columna en time? Creo que sería bueno que el OP aprenda ese concepto. - viento

Intenté tu respuesta, funcionó perfectamente. Gracias. Sin embargo, tengo una pregunta de seguimiento. ¿Qué tal si quiero filtrar el resultado final nuevamente por fecha? digamos que quiero averiguar quiénes estuvieron ausentes o no ingresaron al sistema antes del 06/13/12, suponiendo que haya un nombre de columna "fecha" en el horario - David Addoteye

Utilice esta consulta:

SELECT t1.name,t2.register from user t1 
left join time t2 on t1.user_id=t2.user_id
where t2.register='absent' or t2.register IS NULL;

Respondido el 12 de junio de 12 a las 19:06

Inteligente... ¿Esto parece una copia mía? - Fahim Parkar

Sí, estaba intentando consultas en sqlfiddle con el enlace que proporcionó. Se ve genial para probar consultas rápidamente. Además, preferiría LEFT JOIN ya que evitaría cualquier nombre que esté presente en t2 pero no en t1. - Sushil

lo siento, he reestructurado mi pregunta. cometí un error en mi segunda tabla, en realidad era la identificación de los usuarios de la tabla 1. gracias por su rápida respuesta. - David Addoteye

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.