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
我有 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