我让这个 mysql select 工作得很好。它返回正确的数据。我似乎无法获得正确的上下文来放置 custnum 的实际计数,因此它会出现在下拉选项选择的末尾。 此语句返回正确的位置名称
$statement = $pdo->prepare("SELECT locationname FROM location WHERE locationname IN (SELECT locationname FROM location_user WHERE custnum= :custnum GROUP BY locationname HAVING COUNT( DISTINCT email) < 6 )");
$statement->execute(array(':custnum' => $session->custnum));
while($row = $statement->fetch(PDO::FETCH_ASSOC)){
echo'<option value="'.$row['locationname'].'">'.$row['locationname'].'('. $row['COUNT(total)'] .')</option>';
}
这是我获取每个 custnum 总数的尝试之一
$statement = $pdo->prepare("SELECT locationname, COUNT(custnum) AS total FROM location WHERE locationname IN (SELECT locationname FROM location_user WHERE custnum= :custnum GROUP BY locationname HAVING COUNT( DISTINCT email) < 6 )");
$statement->execute(array(':custnum' => $session->custnum));
while($row = $statement->fetch(PDO::FETCH_ASSOC)){
echo'<option value="'.$row['locationname'].'">'.$row['locationname'].'('. $row['total'] .')</option>';
}
这是我的表格
table location table location_user
custnum | locationname custnum | locationname | email | userlevel
1 location1 1 location1 1me@you.com 3
1 location2 1 location1 1me@you.com 1
1 location1 2me@you.com 2
1 location1 3me@you.com 2
1 location1 4me@you.com 2
1 location1 5me@you.com 2
1 location2 1me@you.com 2
1 location2 1me@you.com 3
第一个选择返回
location1()
location2()
第二个选择返回
location1(2)
我实际上需要查询正在执行的不同电子邮件的计数,并且只返回表中不同电子邮件的位置名称少于 6,但我如何获得每个位置名称的不同电子邮件的实际数量。
此选择将检索 DISTINCT 电子邮件的总数,但我如何在我的 while 循环中将两者合二为一?
$statement2 = $pdo->prepare("SELECT COUNT(email) AS total FROM location_user WHERE custnum= :custnum GROUP BY locationname HAVING COUNT( DISTINCT email) < 6");
$statement2->execute(array(':custnum' => $session->custnum));
这是在 Peter 的帮助下以及 Tin 的一点点插入下的工作版本。
$statement = $pdo->prepare("SELECT l.locationname, COUNT(DISTINCT lu.email) AS total
FROM location l LEFT JOIN location_user lu ON l.locationname = lu.locationname AND l.custnum = lu.custnum WHERE l.custnum = :custnum GROUP BY l.locationname HAVING COUNT(DISTINCT lu.email) < 5 ");
$statement->execute(array(':custnum' => $session->custnum));
while($row = $statement->fetch(PDO::FETCH_ASSOC)){
echo'<option value="'.$row['locationname'].'">'.$row['locationname'].'('. $row['total'] .')</option>';
}
这是我正在处理的另一个版本,用于跳过将位置添加到表中的用户。此用户的用户级别始终 > 2。uselevel 仅作为 1-9 之间的值放置在 location_user 表中。所以我仍然需要位置名称,但我不希望他们的位置包含在计数中。我刚刚意识到我实际上可以走更好的路线,因为我想计算的唯一电子邮件的用户级别为 2。我使用不同的电子邮件来过滤掉用户级别 1。我会试一试。以下版本删除了不在 location_user 表中的我的位置,但它返回了正确的计数。
SELECT l.locationname, COUNT(lu.userlevel) AS total
FROM location l LEFT JOIN location_user lu
ON l.locationname = lu.locationname
AND l.custnum = lu.custnum
WHERE l.custnum = :custnum
AND lu.userlevel = 2
GROUP BY l.locationname
HAVING COUNT(lu.userlevel) < 6
最佳答案
UPDATE2:根据您的评论。试试这个方法
SELECT l.locationname, COUNT(DISTINCT lu.email) AS total
FROM location l LEFT JOIN location_user lu
ON l.locationname = lu.locationname
AND l.custnum = lu.custnum
AND lu.userlevel < 3 -- consider only users with user level < 3
WHERE l.custnum = ?
GROUP BY l.locationname
HAVING COUNT(DISTINCT lu.email) < 6
示例输出:
| LOCATIONNAME | TOTAL | |--------------|-------| | location1 | 5 | | location2 | 1 | | location3 | 0 |
这是 SQLFiddle 演示
关于php - PDO 选择并计数 IN HAVING DISTINCT 出现在下拉列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20916825/