Php 返回已准备语句中的计数总数
下面的语句从用户位于特定帐户的特定计算机内的各种表/条件中获取用户ID的行计数。它按预期工作。示例输出如下所示:Php 返回已准备语句中的计数总数,php,mysql,sql,count,Php,Mysql,Sql,Count,下面的语句从用户位于特定帐户的特定计算机内的各种表/条件中获取用户ID的行计数。它按预期工作。示例输出如下所示: Array ( [0] => Array ( [computer_name] => COMPUTER_1 [username] => Steve [t1count] => 13 [t2count] => [t3
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这样的东西对我来说都是新的,尽管我“似乎”正在学习它。希望小提琴使数据库的设置和我要做的事情变得更加清晰。我认为令人困惑的是,仅仅从帐户中的特定计算机中选择用户。