php - PDO 选择并计数 IN HAVING DISTINCT 出现在下拉列表中

标签 php mysql sql pdo

我让这个 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/

相关文章:

MySQL 过滤步骤

PHP 函数比较两个表中的数据以合并到现有脚本中

mysql - 从 mySql 中的两列创建日期

c# - 使用 OR 语法在多个列上连接一个表

php - Joomla 登录重定向回页面到上一页

php - 功能有时只工作

php - 网站到IOS App

sql - 使用 else/if 语句还是 SQL 查询更快?

php - mySQL - FIND_IN_SET() 找不到该值

PHP:在数组中保留所需的值