【问题标题】:How can I check if row exists in multiple tables with one query?如何使用一个查询检查多个表中是否存在行?
【发布时间】:2019-08-29 01:56:42
【问题描述】:

我有三个表,我想查看其中任何一个中是否存在一行。

这是我的三个问题。如何将它们合二为一?

$dbh->prepare("SELECT id FROM users WHERE email = :email");
$dbh->prepare("SELECT id FROM employees WHERE email = :email");
$dbh->prepare("SELECT id FROM teachers WHERE email = :email");

if(!$row) { // If row not found
    // continue with registration
}

【问题讨论】:

    标签: php mysql select pdo where


    【解决方案1】:

    您可以使用UNION 查询。如果用户在多个表中有不同的id 值,这将返回多行,但因为您只需要知道是否存在一行或多行就可以了。

    SELECT id FROM users WHERE email = :email
    UNION
    SELECT id FROM employees WHERE email = :email
    UNION
    SELECT id FROM teachers WHERE email = :email
    

    或者,您可以使用EXISTS 表达式从查询中获得简单的是/否结果:

    SELECT EXISTS (SELECT * FROM users WHERE email = :email)
        OR EXISTS (SELECT * FROM employees WHERE email = :email)
        OR EXISTS (SELECT * FROM teachers WHERE email = :email)
    

    如果您想知道电子​​邮件地址在哪个表中,您可以修改UNION 查询以返回该信息:

    SELECT 'users' AS `table`, id FROM users WHERE email = :email
    UNION
    SELECT 'employees', id FROM employees WHERE email = :email
    UNION
    SELECT 'teachers', id FROM teachers WHERE email = :email
    

    【讨论】:

    • 考虑 id 是否有用,或者您是否要识别哪个表。例如SELECT 'users' AS 'which_table',id FROM USER ... UNION SELECT 'employees',id ....
    • @danblack OPs 的问题似乎暗示他们并不真正关心“我想看看其中是否存在一行”以及if(!$row) { // If row not found。但无论如何都值得添加...已编辑。谢谢
    • 哪一个性能更快? UNIONEXISTS?
    • @TimmyBalk 可能是EXISTS,因为它可以在得到结果后立即停止处理,例如如果users 中存在匹配值,则无需执行其他两个SELECTS,因为无论电子邮件地址是否在其他两个表中,结果都会为真。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 2022-12-20
    • 2013-04-04
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多