2011-05-20 17 views
7

I reelaborado mi base de datos de la tabla de un usuario a múltiples tablas de usuario (divididos por función): tblStudents, tblTeachers, tblAdminSelección de varias tablas con UNION

Al entrar, yo no quiero correr tres consultas a compruebe si el usuario existe en algún lugar de mi base de datos. Así que lo que hice fue elaborado la siguiente consulta con union

select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s 
union 
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a 
union 
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t 

Esto selecciona los campos que son los mismos en todas las mesas y da salida a los resultados muy bien para mí.

Entonces, decidí probar esto y por alguna razón, mi formulario de inicio de sesión no funcionaría. Para mi formulario de inicio de sesión, agregué una cláusula where que busca la dirección de correo electrónico. Ejecuté la consulta en mi aplicación de base de datos y sorprendentemente, cuando lo hago, por ejemplo, where email = "[email protected]" (este correo electrónico existe en mi base de datos tblAdmin), también selecciona un registro de la tabla de mis alumnos.

Con la cláusula where:

select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s 
union 
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a 
union 
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t 
where email = "[email protected]" 

Los registros tanto have id = 1 pero no entiendo por qué sería seleccionar el registro del estudiante cuando estoy filtrando en la dirección de correo-e-mail. ¿Por qué es esto? ¿Alguien puede explicarme y brindarme una mejor solución a este problema? Básicamente, tengo un formulario de inicio de sesión y necesito seleccionar entre varias tablas para verificar si el usuario existe en mi db.

+1

que no parece ser su consulta completa, ya que no hay filtrado en ella. ¿Puedes publicar toda la consulta? –

+0

Pensé que sería claro; actualizado con la otra consulta :) – cabaret

+0

Noté que no está poniendo la cadena entre comillas. ¿Es eso un mistype? – roberttdev

Respuesta

10

Gracias por actualizar la consulta; ahora podemos ver que la condición WHERE solo se aplica a la última consulta UNIONed. Necesita ya sea agregue esa cláusula WHERE a cada consulta, o envuélvala como una subselección y aplique la cláusula WHERE a eso.

select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s 
where email = "[email protected]" 
union 
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a 
where email = "[email protected]" 
union 
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t 
where email = "[email protected]" 

o

SELECT * FROM (
select s.id as id, s.email as email, s.password as password, s.role as role from tblStudents s 
union 
select a.id as id, a.email as email, a.password as password, a.role as role from tblAdmin a 
union 
select t.id as id, t.email as email, t.password as password, t.role as role from tblTeachers t 
) foo where email = "[email protected]" 
+0

Muchas gracias. Voy a intentarlo: D – cabaret

+0

Con el segundo ejemplo, aparece el siguiente error: 'Cada tabla derivada debe tener su propio alias'. – cabaret

+0

Lo siento, agregué un alias. –

0
SELECT 
    R.co_C, 
    company3.Statuss 
FROM 
    (
     SELECT 
      company1.co_C 
     FROM 
      company1 
     UNION ALL 
      SELECT 
       company2.co_C 
      FROM 
       company2 
    ) AS R 
LEFT JOIN company3 ON R.co_C = company3.co_A; 
+1

Absténgase de dar solo respuestas por código. –

Cuestiones relacionadas