MySQL使用行值计数数据而没有新的查询循环

时间:2015-02-18 18:12:14

标签: php mysql sql count multiple-columns

我有4张时事通讯表。通讯,订阅者,订阅者组和选定的订阅者组。我在广告系列编辑区域中选择订阅者组,并将选定的组保存到tbl_newsletter_groups表格中;

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();

感谢。

1 个答案:

答案 0 :(得分:0)

您想要的搜索词是"基于集合的逻辑"。

您的想法是合理的:您需要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