从另一个表中检索命中的SUM

时间:2011-11-23 21:28:26

标签: php mysql

我的查询是:

  

SELECT * FROM sites WHERE status ='1'ORDER BY ID DESC

从这里开始,在我的while循环中,我有所有活跃的url。我想检查另一个表'hits'中的这些网址,并获取每个活动网站的“统计信息”的总和。

如何实现这一目标?这是用JOIN语句完成的吗?

表格结构

站点

id  int(11) unsigned    NO  PRI NULL    auto_increment
url varchar(100)    NO  UNI     
status  int(11) YES     1   
added   timestamp   NO      CURRENT_TIMESTAMP   on update CURRENT_TIMESTAMP

命中

id  int(11) unsigned    NO  PRI NULL    auto_increment
domain  varchar(30) NO          
stats   int(11) YES     NULL    
added   timestamp   NO      CURRENT_TIMESTAMP   

2 个答案:

答案 0 :(得分:3)

SELECT
    A.id,COUNT(1) site_hits
FROM
    (SELECT id FROM sites WHERE status='1' ORDER BY id DESC) A
    INNER JOIN
    hits B ON A.id = B.site_id
GROUP BY
    A.id
;

此查询的CAVEAT#1:您需要一个好的索引。我推荐以下内容:

ALTER TABLE sites ADD INDEX status_id_ndx (status,id);

此查询的CAVEAT#2:您可以提高索引效率。

如果状态为int(11),则可以容纳2147483647个可能的状态值。我不认为你有那么多。如果状态的最高值< 256,您可以按如下方式更改它:

ALTER TABLE sites MODIFY COLUMN status int unsigned not null;

结果?较小的表,小索引和更快的访问。

你需要这样的东西。我没有看到您的问题中的网站和匹配之间存在任何关联。您需要将网站的ID存储在hits表中。如果您尝试通过域加入网址,则需要以这种方式表达加入。那部分看起来很混乱。它会像这样:

SELECT
    A.id,COUNT(1) site_hits
FROM
    sites A,hits B
WHERE
    LOCATE(B.domain,A.url)
GROUP BY
    A.id
;

答案 1 :(得分:0)

Rolando在正确的轨道上,但要总结你需要更多这样的数据:

select sites.id, sites.url, sum(hits.stats)
from sites
join hits on sites.url = hits.domain
where sites.status = 1
group by sites.id, sites.url

如果您希望网站处于有效状态但没有匹配,请将join设为left join