Php PDO选择和计数在下拉列表中有不同的显示

Php PDO选择和计数在下拉列表中有不同的显示,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,我的mysql选择工作得很好。它返回正确的数据。我似乎无法获得正确的上下文来放置custnum的实际计数,因此它将显示在下拉选项select的末尾。 此语句返回正确的位置名称 $statement = $pdo->prepare("SELECT locationname FROM location WHERE locationname IN (SELECT locationname FROM location_user WHERE custnum= :custnum GROUP BY lo

我的mysql选择工作得很好。它返回正确的数据。我似乎无法获得正确的上下文来放置custnum的实际计数,因此它将显示在下拉选项select的末尾。 此语句返回正确的位置名称

$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>';    
}
第一个选择返回

 location1()
 location2()
 location1(2)
第二个选择返回

 location1()
 location2()
 location1(2)
我实际上需要查询正在执行的不同电子邮件的计数,并且只返回表中不超过6的不同电子邮件的locationname,但是如何获得每个locationname的不同电子邮件的实际数量

此选择将检索不同电子邮件的总数,但如何将这两者合并为一个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));
$statement2=$pdo->prepare(“选择COUNT(电子邮件)作为来自位置的总计用户,其中custnum=:custnum GROUP BY locationname具有COUNT(不同的电子邮件)<6”);
$statement2->execute(数组(':custnum'=>$session->custnum));
这是彼得的帮助下的工作版本和锡的一点刺激

 $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>';    
 }
$statement=$pdo->prepare(“选择l.locationname,COUNT(DISTINCT lu.email)作为总数
从位置l向左加入位置u用户lu ON l.locationname=lu.locationname和l.custnum=lu.custnum,其中l.custnum=:custnum按l.locationname分组,具有计数(不同的lu.email)<5“;
$statement->execute(数组(':custnum'=>$session->custnum));
while($row=$statement->fetch(PDO::fetch_ASSOC)){
回显'.$row['locationname'].'('.$row['total'].');
}
这是我正在开发的另一个版本,用于跳过将位置添加到表中的用户。此用户的userlevel始终大于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
选择l.locationname,计数(lu.userlevel)作为总数
从位置l左连接位置\用户lu
在l.locationname=lu.locationname上
l.custnum=lu.custnum
其中l.custnum=:custnum
和lu.userlevel=2
按l.locationname分组
计数(lu.userlevel)<6

您实际上不需要从表
位置
中查询,因为您已经从表
位置用户

SELECT locationname, count(DISTINCT email) as total FROM location_user WHERE custnum = :custnum GROUP BY locationname HAVING count(DISTINCT email) < 6
选择locationname,count(不同的电子邮件)作为location_user的总计,其中custnum=:custnum按locationname分组,count(不同的电子邮件)<6

根据您的评论更新2:。这样试试看

选择l.locationname,计数(不同的lu.email)作为总数
从位置l左连接位置\用户lu
在l.locationname=lu.locationname上
l.custnum=lu.custnum
LU.USSReal< 3——只考虑用户级别<3的用户
其中l.custnum=?
按l.locationname分组
有计数(不同的lu.电子邮件)<6
样本输出:

| LOCATIONNAME | TOTAL | |--------------|-------| | location1 | 5 | | location2 | 1 | | location3 | 0 | |地点名称|总计| |--------------|-------| |位置1 | 5| |位置2 | 1| |位置3 | 0|
这里是演示

您能显示表架构和示例数据吗?我添加了表信息和一个select,它将检索全部电子邮件,但我不知道如何将while循环合并到一个语句中。您能根据示例数据显示准确的所需输出吗?您的解释不清楚。所发布的表数据的预期输出将是location1(5)和location2(1),因为它处理这两个1me@you.com位置1中的电子邮件作为一个。谢谢Peterm,我想这样就可以了。我快到了。这些连接看起来更熟悉一些。谢谢你的时间和专业知识。谢谢你的回复。这两个表都有custnum,但我刚刚意识到上一个版本返回了正确的值,但这不是我想要的。从现在开始的第一个选择在下拉列表中返回两个字符串,但不返回总数。第二个返回一个字符串,其中数字2表示总数。所以我认为它返回的是两个位置的总数。我可能需要调整我的表。在这种情况下,我认为您需要在查询结束时按locationname分组,您将在下拉列表中再次获得两个字符串。我尝试了上面的选择与内部联接,它返回与上面发布的第二个选择相同的结果。好的,我需要再次查看我的代码。我在location表中添加了另一个locationname,但没有得到我认为会得到的结果。我认为它工作正常,所以select只能显示location_用户表中location表中的location名称不到6次。请看peterm的另一个答案,他知道了!这很好,但我需要它从location表中提取那些locationname,如果它们尚未添加到location\u user表中。这就是为什么我在选择中使用了。非常感谢!你解决了我的问题。我很难接受那些涉及到这一点的join语句。它看起来正是我想要的。我得到字符串以及每个字符串的数量,如果有6个字符串,它会删除它们,因此它们不可选择。太棒了。很抱歉给你带来了困惑。我将编辑您的代码以使用我的pdo变量bind。很抱歉,我完全忘记有一个用户正在向表中添加位置,我希望从电子邮件计数中跳过这些位置。它可以基于userlevel,因为我在location\u user中有这个值。如果用户级别>2,我想跳过计算电子邮件。我不知道该在哪里添加代码,但我会看看你的代码,并将其发布在上面。请参阅更新的答案和sqlfiddle示例