【问题标题】:MySQL query, COUNT and SUM with two joined tables带有两个连接表的 MySQL 查询、COUNT 和 SUM
【发布时间】:2013-04-29 14:58:50
【问题描述】:

我需要一些有关 MySQL 查询的帮助。

我有两张表,一张是backlinks 的列表,带有is_homepage(布尔)标志。第二个表是所有backlinksdomains 列表,一个是link_found (bool) 标志,一个url_count 列是backlinks 表中关联的行数与每个域。

注意domain_id 列是域表id 列的外键。这是一些示例数据。

反向链接

id    domain_id    is_homepage    page_href
1     1            1              http://ablog.wordpress.com/
2     1            0              http://ablog.wordpress.com/contact/
3     1            0              http://ablog.wordpress.com/archives/
4     2            1              http://www.somewhere.org/
5     2            0              http://www.somewhere.org/page=3
6     3            1              http://www.great-fun-site.com/
7     3            0              http://www.great-fun-site.com/index.html
8     4            0              http://red.blgspot.com/page=7
9     4            0              http://blue.blgspot.com/page=9

id    url_count    link_found    domain_name
1     3            1             wordpress.com
2     2            0             somewhere.org
3     2            1             great-fun-site.com
4     2            1             blgspot.com

我希望从上述数据中得到的结果是:count = 2,total = 5

我试图从域表中获取行数(计数),然后从域表中获取 url_count(总计)的总和,其中 link_found 为 1,并且反向链接表中的链接之一is_homepage 是 1。

这是我正在尝试使用的查询。

SELECT SUM(1) AS count, SUM(`url_count`) total
FROM `domains` AS domain 
LEFT JOIN `backlinks` AS link ON link.domain_id = domain.id 
WHERE domain.id IN (
        SELECT DISTINCT(bl.domain_id)
        FROM `backlinks` AS bl
        WHERE bl.tablekey_id = 11
        AND bl.is_homepage = 1
)
AND domain.link_found = 1
AND link.is_homepage = 1
GROUP BY `domain`.`id`

这个查询的问题是它为domains 表中的每个条目返回一行。我想我可能还需要一个子查询来将返回的结果相加,但我不确定这是否正确。有谁看到我做错了什么?谢谢!


编辑:

我遇到的问题是,如果反向链接表中有多个主页,那么它会被多次计数。我只需要计算每个域一次。

【问题讨论】:

  • 您应该发布解决问题的查询作为答案,然后接受它。
  • 好的。它说我必须等待 2 天才能接受我自己的答案,所以我会在本周晚些时候做。

标签: mysql count sum


【解决方案1】:

好吧,您不必进行分组,因为您没有选择聚合字段以外的任何内容。我不是 mysql 专家,但这应该可以:

SELECT count(d.id) as count, sum(d.url_count) as total from domains as d
inner join backlinks as b 
on b.domain_id = d.id 
 Where d.Link_found = 1  and b. is_homepage = 1

【讨论】:

    【解决方案2】:

    domains 表中的每个条目都有一行的原因是您按domain.id 分组。如果您只想要总计,请忽略 GROUP BY 部分。

    我认为一个相当简单的查询就可以解决问题:

    SELECT COUNT(*), SUM(domains.URL_Count)
    FROM domains
    WHERE domains.link_found = 1 AND domains.id IN (
      SELECT domain_id FROM backlinks WHERE is_homepage = 1)
    

    有一个有效的 SQLFiddle here

    【讨论】:

      【解决方案3】:

      感谢您的帮助。抱歉,很难解释我需要一个 MySQL 小提琴 :)

      如果有人对我的结果感兴趣:

      SELECT SUM(1) AS count, SUM(total) AS total
      FROM
      (
      SELECT SUM(`url_count`) total
      FROM `domains` AS domain 
      LEFT JOIN `backlinks` AS link ON link.domain_id = domain.id 
      WHERE domain.id IN (
              SELECT DISTINCT(bl.domain_id)
              FROM `backlinks` AS bl
              WHERE bl.tablekey_id = 11
              AND bl.is_homepage = 1
      )
      AND domain.link_found = 1
      AND link.is_homepage = 1
      GROUP BY `domain`.`id`
      ) AS result
      

      【讨论】:

        猜你喜欢
        • 2012-01-22
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        • 2011-09-11
        • 2021-08-23
        • 2014-11-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多