【发布时间】:2014-01-04 04:19:54
【问题描述】:
我有这个 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。用户级别仅作为 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
【问题讨论】:
-
你能显示表模式和示例数据吗?
-
我添加了表格信息和一个将检索电子邮件总数的选择,但我不知道如何将 while 循环组合成一个语句。
-
您能否根据示例数据显示准确所需的输出?你的解释不清楚。
-
发布的表数据的所需输出将是 location1(5) 和 location2(1),因为它将 location1 中的两封 1me@you.com 电子邮件视为一个。
-
谢谢彼得姆,我想这样就可以了。我越来越近了。这些连接看起来有点熟悉。感谢您的所有时间和专业知识。