MySQL 在没有新查询循环的情况下计算具有行值的数据

MySQL count datas with row values without new query loop

我有 4 table 个简报。时事通讯、订阅者、订阅者组和选定的订阅者组。我在广告系列编辑区选择了订户组,并将选定的组保存到 tbl_newsletter_groups table like;

tbl_newsletters

NID    title     details
 1     text 1    content 1
 2     text 2    content 2

tbl_subscriber_groups

GID   group_name
 5    group 1
 6    group 2

tbl_subscribers

SID   GID  email             name
 10    5   sub1@mail.com     sub1 name
 11    6   sub1@mail.com     sub1 name

tbl_newsletter_groups

NGID    NID   GID
 15      1     6
 16      1     6
 17      1     6

我想在我的页面中列出时事通讯时显示所选订阅者总数。我的解决方案工作正常,我正在寻找简单明了的声明,有没有更快的方法,比如在单个时事通讯列表声明中?

这是我自己的计数风格(是的,我知道这太糟糕了,而且路途遥远);

$subGID = array();
$list = $myconn->query("SELECT * FROM tbl_newsletters");
while($listRs = $list->fetch_assoc()){
   $grps = $myconn->query("SELECT * FROM tbl_newsletter_groups WHERE NID=". $listRs['NID'] ."");
   while($grpsRs = $grps->fetch_asscoc()){
      $subGID[] = $grpsRs['GID'];
    } $grps->free();
   $subs = implode(" OR GID=",$subGID);
   $count = mysqli_num_rows($myconn->query("SELECT ID FROM tbl_subscribers WHERE GID=". $subs));
   echo('Total Selected Subscriber: '.$count);
} $list->free();

谢谢。

您要搜索的词是"set-based logic"。

您的想法是正确的:您需要 tbl_newsletters 的所有内容,然后您需要计算 tbl_subscribers 的结果,但为了获得这些结果,您需要 tbl_newsletter_groups 的信息。

在 SQL 中,这表示您想要加入。您已经找到了所需的条件,只是不知道语法。参考手册可以提供帮助。

现在您将拥有一堆记录,您需要将它们分解成更少的记录。您需要聚合函数和一个 GROUP BY 子句。

所以这是最后的查询:

SELECT n.NID, n.title, n.details, COUNT(s.SID)
FROM   tbl_newsletters AS n
  JOIN tbl_newsletter_groups AS g ON n.NID = g.NID
  JOIN tbl_subscribers AS s ON g.GID = s.GID
GROUP BY n.NID