我有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();
感谢。
答案 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