我的查询是:
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
答案 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
。