【问题标题】:pdo - get number of rows for multiple tables as separate queries?pdo - 获取多个表的行数作为单独的查询?
【发布时间】:2014-05-05 17:39:16
【问题描述】:

我需要使用 pdo 的相同条件从多个表中获取行数。例如,这将为我提供表 users 的行数。

$stmt = $db->prepare("SELECT * FROM `users` WHERE `account_id` = ? AND (`computer_name` = 'name1' OR `computer_name` = 'name2' OR `computer_name` = 'name3');
$stmt->execute(array($_SESSION['user']['account_id']));

$result = $stmt->fetchColumn();

现在,我想运行相同的查询,但使用不同的表...例如...users1users2users3users4 等。

当然,这些表都是不同的,但都有account_idcomputer_name 列。是否有可能以某种方式连接所有这些表,并且仍然可以具体计算每个表,还是我需要为每个表运行多个选择到数据库?

目标是为登录用户创建一个显示,显示数据库中有多少条记录用于不同的表。

预期结果是我可以获得满足 WHERE 子句条件的每个表的总行数:

users1 = 50
users2 = 34
users3 = 82
...etc

【问题讨论】:

    标签: php mysql sql pdo


    【解决方案1】:

    你可以这样查询:

    SELECT 'users' as tbl, count(*) as cnt FROM `users` 
    WHERE `account_id` = ? AND (`computer_name` = 'name1' OR `computer_name` = 'name2' OR `computer_name` = 'name3')
    UNION
    SELECT 'users2' as tbl, count(*) as cnt FROM `users2` 
    WHERE `account_id` = ? AND (`computer_name` = 'name1' OR `computer_name` = 'name2' OR `computer_name` = 'name3')
    UNION
    SELECT 'users3' as tbl, count(*) as cnt FROM `users3` 
    WHERE `account_id` = ? AND (`computer_name` = 'name1' OR `computer_name` = 'name2' OR `computer_name` = 'name3')
    

    然后传递适当数量的参数:

    $stmt->execute(array_fill(0, 3, $_SESSION['user']['account_id']));
    

    【讨论】:

    • 这太棒了......那么是否可以在特定表上分解另一个级别?比如说,在表 users2 上,我在 where 子句中添加了 type LIKE 'something' ......因为我使用的是同一张表,我还会做一个全新的联合吗?
    • 是的,在这种情况下,您需要添加另一个 UNION 块,即使在同一张桌子上也是如此。每个带有不同WHERE 子句的计数都需要一个新的UNION
    • 谢谢...我认为这会比单独查询更少的资源密集型,因为只有一个调用,对吗?
    【解决方案2】:

    是的,为了获得计数,您必须在适当的外键上将所有数据表连接在一起。

    【讨论】:

    • 但是我还能得到每个特定表的计数吗?用户 1 = 50,用户 2 = 350,等等...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2014-03-02
    • 2012-12-29
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多