在过去的两天里,我遇到了一个让我发疯的问题。我基本上有4个按以下顺序继承的表:
users
|
categories blogs
| | |
---- pages visits
所以一个用户有很多博客,这些博客有很多页面和访问量。每个页面也属于一个类别。
我想要的只是提取具有以下关联计数的所有用户:
- 每个用户拥有的博客总数
- 每个用户拥有的总页数
- 每个用户拥有博客的类别总数
- 每个用户的总访问次数
- 每个用户拥有的访问者总数(访问,但我们按不同的 ip_address 计数)
我的查询如下:
SELECT
u.id
u.username,
COUNT(b.id) as blogs_count,
COUNT(p.id) as pages_count,
COUNT(v.id) as visits_count,
COUNT(distinct ip_address) as visitors_count
COUNT(c.id) as categories_count
FROM
users u
LEFT JOIN
blogs b ON(b.user_id=u.id)
LEFT JOIN
pages p ON(p.blog_id=b.id)
LEFT JOIN
visits v ON(v.blog_id=b.id)
LEFT JOIN
categories c ON(v.category_id=c.id)
GROUP BY u.id, blogs_count, pages_count, visits_count,
visitors_count, categories_count
我应该得到 24 个用户的计数,但是考虑到我有近 300,000 次访问,我让我的 SQL 数据库永远挂起,可能试图提取数百万行。我不是数据库专家,这很明显。有人能以某种方式指出我正确的方向,这样我就可以做出一个很好的查询,甚至可以在数百万条记录上表现良好(当然使用正确的硬件)?