La sélection entre plusieurs tables avec l'UNION
J'ai retravaillé ma base de données à partir d'un tableau d'utilisateur à utilisateur plusieurs tables (divisé par rôle): tblStudents
, tblTeachers
, tblAdmin
Lors de la connexion, je ne voulais pas courir trois requêtes pour vérifier si l'utilisateur existe, quelque part dans ma DB. Donc ce que j'ai fait a été de mettre ensemble la requête suivante avec 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
Cela permet de sélectionner les champs qui sont les mêmes dans toutes les tables et les sorties les résultats bien pour moi.
Alors, j'ai décidé d'essayer cela et pour une raison quelconque, mon formulaire de connexion ne fonctionne pas. Pour mon formulaire de connexion, j'ai ajouté un where
clause qui vérifie l'adresse e-mail. J'ai couru à la requête dans ma base de données application et étonnamment, quand je fais par exemple where email = "[email protected]"
(cet email existe dans ma base de données tblAdmin
), il sélectionne un enregistrement de mes élèves de table.
Avec la clause 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]"
Les enregistrements à la fois have id = 1
mais je ne comprends pas pourquoi il faudrait choisir le dossier de l'élève quand je suis filtrage sur l'admin adresse e-mail. Pourquoi est-ce? Quelqu'un peut m'expliquer et me donner une meilleure solution à ce problème? En fait j'ai un formulaire de connexion et la nécessité de sélectionner entre plusieurs tables pour vérifier si l'utilisateur existe dans ma db.
Pensais que ce serait plus clair; mis à jour avec une autre requête 🙂
Je remarque que vous ne mettez pas la chaîne de caractères entre guillemets. C'est qu'une faute de frappe?
Si vous voulez dire que l'e-mail = un, ya, je l'ai oublié là; édité.
Sur un sujet connexe; essayez d'éviter d'utiliser "", pour citer vos chaînes. MySQL ne permettent malheureusement, mais si jamais vous avez à migrer vers une autre base de données, il crachera le mannequin à vous. À l'aide de " au lieu de cela est la norme SQL et MySQL et tout le reste.
OriginalL'auteur cabaret | 2011-05-20
Vous devez vous connecter pour publier un commentaire.
Merci pour la mise à jour de la requête; maintenant, nous pouvons voir que la condition est uniquement appliqué à la dernier Réunies requête. Vous devez soit ajouter que la clause where pour chaque requête, ou de l'envelopper comme une sous-sélection et d'appliquer la clause where.
ou
Avec le deuxième exemple, j'obtiens l'erreur suivante: "Chaque table dérivée doit avoir son propre alias".
Désolé, ajout d'un alias.
Ce n'est que " foo " exactement? Est-ce la même chose que ce que je fais avec
tblAdmin a
? Merci pour votre temps!C'est un alias pour celle-ci; il donne juste un nom que vous pouvez consulter, comme quand tu fais "select s.id as id". Cela vous permettra de sélectionner uniquement certains champs de celle-ci en disant
select foo.email FROM (...) foo
. Si c'est plus clair, vous pouvez (dans la plupart des Sgbdr) dire: "COMME foo" au lieu de "foo". Le nom lui-même est arbitraire; appelez cela comme vous le voulez, je viens d'utiliser foo par défaut 🙂OriginalL'auteur El Yobo
OriginalL'auteur sajjad parmar