我有一个表格,我从中选择“项目经理”并提取相关数据。
他们每个人都有许多他们管理的“客户”。
客户端按名称链接到他们的项目经理。
例如:John Smith有3个客户。每个客户都有一个名为“经理”的名字。
以下是该表的简单版本:
name | type | manager
--------------------------------------
John Smith | manager |
Client 1 | client | John Smith
Client 2 | client | John Smith
Client 3 | client | John Smith
John Carry | manager |
Client 4 | client | John Carry
Client 5 | client | John Carry
Client 6 | client | John Carry
我想返回以下数据:
约翰史密斯 - 3个客户
John Carry - 3位客户
我使用此查询返回数据:
select t.name,
count(t1.name) TotalClients
from yourtable t
inner join yourtable t1
on t.name = t1.manager
group by t.name;
http://sqlfiddle.com/#!2/d72a87/2
哪个在phpMyAdmin和小提琴中正常工作,但是当我使用PHP脚本(一个简单的查询并回显$ row ['name'])时,它选择了最后一个被计算的客户端(客户端3)但是为John Smith返回正确的Total Clients值。
如何让php脚本返回与sql脚本相同的结果?
PHP脚本:
$sql = mysql_query("select t.name,
count(t1.name) TotalClients
from users t
inner join users t1
on t.name = t1.manager
group by t.name;");
while($row = mysql_fetch_assoc($sql)){
echo $row['name'];
echo $row['TotalClients'];
}
名称返回不正确的值; TotalClients返回正确的值
答案 0 :(得分:1)
您没有显示问题。你的小提琴例子是有效的,它也应该在PHP中运行得很好。但是小提琴例子不是你的现实。表用户在哪里?也许是你的错误。
无论如何,您的查询似乎过分冗余。您可以使用更简单的方法获得相同的结果:
SELECT
`manager`,
COUNT(*)
FROM
`yourtable`
WHERE
`type` = 'client'
GROUP BY
`manager`;
除非你想要显示经理人也有0个客户,在这种情况下你需要更详细的LEFT JOIN
:
SELECT
`manager`.`name`,
COUNT(`client`.`name`) `TotalClients`
FROM
`yourtable` `manager`
LEFT JOIN
`yourtable` `client`
ON
`manager`.`name` = `client`.`manager`
WHERE
`manager`.`type` = 'manager'
GROUP BY
`manager`.`name`;