1

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

我有两张表,一张是backlinks带有is_homepage(布尔)标志的列表。第二个表是domains所有的列表backlinks、一个 was 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从域表 WHERE 中获取(总数)的总和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。我想我可能还需要一个子查询来将返回的结果相加,但我不确定这是否正确。有谁看到我做错了什么?谢谢!


编辑:

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

4

3 回答 3

0

好吧,您不必进行分组,因为您没有选择聚合字段以外的任何内容。我不是 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
于 2013-04-29T15:10:55.313 回答
0

您为表中的每个条目获得一行的原因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 。

于 2013-04-29T15:13:53.407 回答
0

谢谢您的帮助。抱歉,很难解释我需要一个 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
于 2013-04-29T15:58:49.547 回答