Php 返回已准备语句中的计数总数

Php 返回已准备语句中的计数总数,php,mysql,sql,count,Php,Mysql,Sql,Count,下面的语句从用户位于特定帐户的特定计算机内的各种表/条件中获取用户ID的行计数。它按预期工作。示例输出如下所示: Array ( [0] => Array ( [computer_name] => COMPUTER_1 [username] => Steve [t1count] => 13 [t2count] => [t3

下面的语句从用户位于特定帐户的特定计算机内的各种表/条件中获取用户ID的行计数。它按预期工作。示例输出如下所示:

Array
(
    [0] => Array
        (
            [computer_name] => COMPUTER_1
            [username] => Steve
            [t1count] => 13
            [t2count] => 
            [t3count] => 23
            [t4count] => 64
        )
    ... and so on for each
声明:

$stmt = $db->prepare("
    SELECT c.computer_name, users.username, t1count, t2count, t3count, t4count 
    FROM
        ( SELECT account_id, computer_id, computer_name
            FROM computers
            WHERE account_id = ".$_SESSION['user']['account_id']."
            ORDER BY computer_id ASC LIMIT 0, ".$_SESSION['user']['licenses']."
        ) as c
        LEFT JOIN users
            on users.computer_id = c.computer_id

        LEFT JOIN
            (SELECT user_id, COUNT(user_id) as t1count
            FROM t1
            WHERE t1.title LIKE 'started'
            GROUP BY user_id) as t_t1
                on t_t1.user_id = users.user_id

        LEFT JOIN
            (SELECT user_id, COUNT(user_id) as t2count
            FROM t2
            GROUP BY user_id) as t_t2
                on t_t2.user_id = users.user_id

        LEFT JOIN
            (SELECT user_id, COUNT(user_id) as t3count
            FROM t1
            WHERE t1.title LIKE 'blocked'
            GROUP BY user_id) as t_t3
                on t_t3.user_id = users.user_id     

        LEFT JOIN
            (SELECT user_id, COUNT(user_id) as t4count
            FROM t1
            WHERE t1.title LIKE 'closed'
            GROUP BY user_id) as t_t4
                on t_t4.user_id = users.user_id

            ... and so on for each

    WHERE c.account_id = ?
");

我还想在这个语句中返回一个totalsum=t1count+t2count+t3count+t4count,但似乎什么都不起作用。在这种情况下,我无法进行外部处理(添加返回的值)。。。它需要在声明中。如果有更好的选择,我也愿意接受我已有的任何建议。

您打算如何处理这些值
SUM(t1count、t2count、t3count、t4count)作为totalsum应可用于获得计数计数

你的问题有点难理解。您有隐式和显式的
JOIN
s。当您通常可以在一次拍摄中完成这一切时,您将多次分组并拉取列。如果您共享一个SQLFiddle,我将能够清理它,但简而言之:

SELECT 
    c.computer_name, 
    users.username, 
    count(t_t1.user_id) AS t1count, 
    count(t_t2.user_id) AS t2count, 
    count(t_t3.user_id) AS t3count, 
    count(t_t4.user_id) AS t4count, 
    (count(t_t1.user_id)+count(t_t2.user_id)+count(t_t3.user_id)+count(t_t4.user_id)) AS totalsum FROM users
LEFT JOIN computers AS c ON users.computer_id=c.computer_id AND c.account_id=?
LEFT JOIN t1 AS t_t1 ON t_t1.user_id = users.user_id AND t_t1.title LIKE "started"
LEFT JOIN t2 AS t_t2 ON t_t2.user_id = users.user_id
LEFT JOIN t1 AS t_t3 ON t_t3.user_id = users.user_id AND t_t3.title LIKE 'blocked'
LEFT JOIN t1 AS t_t4 ON t_t4.user_id = users.user_id AND t_t4.title LIKE 'closed'
WHERE c.account_id = ?
AND t_t1.title LIKE started
GROUP BY users.user_id;
正如我所说的,这可能需要调整,但它更干净,更容易阅读,应该可以完成一些非常类似的事情

或者,如果当您将查询更改为完全显式联接时,而不是使用
SUM
,无法使查询以您希望的方式运行,请尝试将这些值添加到一起,就像我在上面的示例中所做的那样。它应该防止它们以同样的方式聚合

编辑

在查看了您的SQLFIDLE之后,我修改了一个解决方案,它消除了嵌套查询。积极的一面是它更干净。否定的是,它要求您在
子句中使用
指定用户

SELECT computers.account_id,computers.computer_id,computers.computer_name,users.user_id,users.username,count(distinct t_count1.log_id) AS count1,count(distinct t_count2.log_id) AS count2,count(distinct t_count3.log_id) AS count3, count(distinct t_count4.event_id) AS count4,
(count(distinct t_count1.log_id) + count(distinct t_count2.log_id) + count(distinct t_count3.log_id) + count(distinct t_count4.event_id)) AS totalcount

FROM users
INNER JOIN computers ON computers.computer_id=users.computer_id
LEFT JOIN logs AS t_count1 ON t_count1.type LIKE 'type1' AND t_count1.user_id=users.user_id
LEFT JOIN logs AS t_count2 ON t_count2.type LIKE 'type2' AND t_count2.user_id=users.user_id
LEFT JOIN logs AS t_count3 ON t_count3.type LIKE 'type3' AND t_count3.user_id=users.user_id
LEFT JOIN events AS t_count4 ON t_count4.user_id = users.user_id
WHERE computers.account_id=1 AND computers.computer_id in (1,2)
GROUP BY users.user_id
ORDER BY users.user_id ASC,computers.computer_id ASC;
如果出于任何原因选择保留当前的查询结构,那么对其进行这样的调整将使其适合您:

select *,ifnull(count1,0)+ifnull(count2,0)+ifnull(count3,0)+ifnull(count4,0) AS totalcount from
  ( select account_id, computer_id, computer_name
     from computers
     order by computer_id asc limit 0, 2
  ) as c

  left join users
    on users.computer_id = c.computer_id

  left join
    (select user_id, count(user_id) as count1
       from logs
       where logs.type like 'type1'
       group by user_id) as t_count1
    on t_count1.user_id = users.user_id

  left join
    (select user_id, ifnull(count(user_id),0) as count2
       from logs
       where logs.type like 'type2'
       group by user_id) as t_count2
    on t_count2.user_id = users.user_id

  left join
    (select user_id, count(user_id) as count3
       from logs
       where logs.type like 'type3'
       group by user_id) as t_count3
    on t_count3.user_id = users.user_id

  left join
    (select user_id, count(user_id) as count4
       from events
       group by user_id) as t_count4
      on t_count4.user_id = users.user_id

   where c.account_id = 1;

我的建议是按照每个查询来理解您要求SQL做什么。要实际将所有值相加,应该计算返回的记录数。计算主键的值有助于统计记录。另外,使用第二个示例中的另一个示例,
ifnull
,确保null值不会干扰添加。“如果值为null,则改为0。”

您可以使用
foreach
求和数组值。由于其他原因,它必须在语句中。您准备将
$\u会话['user']['account\u id']
直接导入SQL字符串吗?o_o.只需选择您想要的方式:
t1count+t2count+t3count+t4count totalsum
-完成。是的,因为在select的select中,我无法使绑定工作。。。如果你知道怎么做,请让我知道。我相信这是因为
SUM
aggregates,但是做每行的算术计算应该像我上面评论的那样。你说它没有,所以不能再发光了。不。。。它将返回所有用户,而不仅仅是来自所选comp的用户(我看到这被忽略了,但这就是为什么我有一个select)并运行一些测试,这些值甚至不接近。我已经做了更新,这应该可以在没有嵌套查询的情况下工作。我确实在你最初的陈述中漏掉了一些条件,但这可能会有所帮助。我花了一些时间制作了一把小提琴,虽然它不精确,但它确实有我需要的所有目的。。。减去所有总数的总和…-如果你有时间,请看一看,因为这可能会把事情弄清楚。谢谢你到目前为止所做的一切!真棒——我很想看看如何做到这一点,因为在过去的几天里,像sql这样的东西对我来说都是新的,尽管我“似乎”正在学习它。希望小提琴使数据库的设置和我要做的事情变得更加清晰。我认为令人困惑的是,仅仅从帐户中的特定计算机中选择用户。