首页 / MYSQL / mysql-每行计数功能
mysql-每行计数功能
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql-每行计数功能,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3448字,纯文字阅读大概需要5分钟。
内容图文
我必须提供一个活跃的不同站点的列表,这些站点具有一个或多个域,并且所有域都被删除了.到目前为止,这是我的查询.
SELECT DISTINCT *
FROM sites JOIN domains ON domains.site = sites.id
WHERE domains.is_deleted = 1 AND sites.is_deleted = 0
根据我的研究,似乎最好的检查网站是否具有多个域的方法是使用COUNT()子查询.如何使用COUNT()计算每个站点的域数?
这是SQL fiddle.
解决方法:
问:如何使用COUNT()来计算每个站点的域数?
(问题的答案在答案的底部.)
有几种不同的查询将返回指定的结果.
我会这样构建查询,从
“活跃的不同站点列表”
我们可以从sites表中获取(非null)is_deleted列为0的行…
SELECT s.id
, s.name
, s.company
, s.association
, s.is_supercharged
, s.is_deleted
FROM sites s
WHERE NOT s.is_deleted
ORDER BY s.id
“拥有一个或多个域”
我们可以编写一个查询,该查询返回域表中站点(FK)列的值的列表
SELECT d.site
FROM domain d
GROUP BY d.site
“并且所有域名都被删除了”
我们可以编写另一个查询,该查询返回域中具有is_deleted = 0的行的站点列中的值的不同列表
SELECT a.site
FROM domain a
WHERE NOT a.is_deleted
GROUP BY a.site
我们可以将这三个查询放在一起.我们可以将最后两个查询转换为内联视图(将thme包裹在括号中,然后像表一样引用它们.)我们可以使用内部联接(至少具有一个域的站点)来获得至少具有一个域的站点.并对(具有活动域的站点)使用反联接模式,以排除具有活动域的站点.
例如:
SELECT s.id
, s.name
, s.company
, s.association
, s.is_supercharged
, s.is_deleted
FROM sites s
JOIN ( SELECT d.site AS site_id
FROM domain d
GROUP BY d.site
) r
ON r.site_id = s.id
LEFT
JOIN ( SELECT a.site AS site_id
FROM domain a
WHERE NOT a.is_deleted
GROUP BY a.site
) q
ON q.site_id = s.id
WHERE q.site_id IS NULL
AND NOT s.is_deleted
ORDER BY s.id
这只是将返回指定结果的几种不同查询模式之一.
我们也可以这样写查询,以返回一个唯一的站点列表,其中“域”的“数量”等于被删除域的“数量”
SELECT d.site
FROM domain d
GROUP BY d.site
HAVING SUM(IF(d.is_deleted,1,0)) = SUM(1)
这样,我们可以只使用内部联接到站点…
SELECT s.id
, s.name
, s.company
, s.association
, s.is_supercharged
, s.is_deleted
FROM sites s
JOIN ( SELECT d.site AS site_id
FROM domain d
GROUP BY d.site
HAVING SUM(IF(d.is_deleted,1,0)) = SUM(1)
) q
ON q.site_id = s.id
WHERE NOT s.is_deleted
ORDER BY s.id
还有其他几种返回等效结果的模式.
问:如何使用COUNT()来计算每个站点的域数?
要获取具有至少一个域的站点的每个站点的域计数,而不必考虑站点本身是否为is_deleted:
SELECT d.site
, COUNT(1) AS count_domains
FROM domain d
GROUP BY d.site
同样,要获取每个站点的“ is_deleted”域计数(对于具有至少一个域的站点)
SELECT d.site
, COUNT(IF(d.is_deleted,1,NULL)) AS count_deleted_domains
FROM domain d
GROUP BY d.site
我们可以合并这些查询,并同时返回站点的两个计数.
这些查询省略了零的“计数”.要获得零计数,并且仅包括未is_deleted的网站,请执行以下操作:
SELECT s.id AS `site`
, COUNT(d.site) AS `count_domains`
, COUNT(IF(d.is_deleted,1,NULL)) AS `count_deleted_domains`
FROM site s
LEFT
JOIN domain d
ON d.site = s.id
WHERE NOT s.is_deleted
GROUP BY s.id
ORDER BY s.id
我们还可以在HAVING子句中引用COUNT()聚合的结果.
该查询将返回没有任何“活动”域的所有站点,包括没有任何相关域的站点.
SELECT s.id AS `site`
, COUNT(d.site) AS `count_domains`
, COUNT(IF(d.is_deleted,1,NULL)) AS `count_deleted_domains`
FROM site s
LEFT
JOIN domain d
ON d.site = s.id
WHERE NOT s.is_deleted
GROUP BY s.id
HAVING COUNT(d.site) = COUNT(IF(d.is_deleted,1,NULL))
ORDER BY s.id
我们可以轻松地对其进行修改,以返回指定的站点列表(将对站点表中列的引用添加到SELECT列表中),并从SELECT列表中省略COUNT()表达式.
如果我们只希望拥有至少一个域的站点,则只需删除LEFT关键字即可使其成为内部联接,而不是外部联接.
内容总结
以上是互联网集市为您收集整理的mysql-每行计数功能全部内容,希望文章能够帮你解决mysql-每行计数功能所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。