2011-11-04 69 views
1

我现在正在处理的项目需要一个参考系统(目前他们有5万个成员)。我决定在会员表中添加refref_id字段。从同一个成员表中计算2个日期之间的新成员

的成员表的结构;

id (int auto), 
admin (enum (1,0)), 
ref (enum (1,0)), 
ref_id (int), 
country_id (int), 
city_id(int), 
town_id(int), 
totalRef (int), 
fullName (varchar), 
registrationDate (datetime) 

我想列出在两个日期之间有新成员的查阅者数据。我想提供更多的细节,所以我也尝试在查询中添加国家,城市和城镇。我尝试了下面的查询,但我不认为这是一个很好的方法去考虑它需要很长时间来加载;

SELECT m.id, m.fullName, m.country_id, m.city_id, m.town_id, m.totalRef, 
(select name from country where country.id = m.country_id) as countryName, 
(select name from city where city.id = m.city_id) as cityName, 
(select name from town where town.id = m.town_id) as townName, 
(select count(id) from members where members.ref_id = m.id AND ref_id > 0 AND registrationDate BETWEEN '2011.11.04 00:00:00' AND '2011.11.04 23:59:59') as newRef 

FROM members as m 

WHERE 

m.country_id = '224' AND 
m.city_id = '4567' AND 
m.town_id = '78964' AND 
m.admin = '0' AND 
m.ref = '1' 

ORDER BY newRef DESC 
LIMIT 0, 25 

如果你能帮我解决这个问题,我会很高兴。先谢谢你。

回答

1

事情是这样的 -

SELECT 
    m.id, 
    m.fullName, 
    m.country_id, 
    m.city_id, 
    m.town_id, 
    m.totalRef, 
    cnt.name countryName, 
    ct.name cityName, 
    t.name townName, 
    m2.newRef 
FROM members as m 
    LEFT JOIN country cnt 
    ON cnt.id = m.country_id 
    LEFT JOIN city ct 
    ON ct.id = m.city_id 
    LEFT JOIN town t 
    ON t.id = m.town_id 
    LEFT JOIN (
    SELECT ref_id, COUNT(id) newRef FROM members 
     WHERE ref_id > 0 AND registrationDate BETWEEN '2011.11.04 00:00:00' AND '2011.11.04 23:59:59' 
     GROUP BY ref_id 
    ) m2 
    ON m2.ref_id = m.id 
WHERE 
    m.country_id = '224' AND 
    m.city_id = '4567' AND 
    m.town_id = '78964' AND 
    m.admin = '0' AND 
    m.ref = '1' 
ORDER BY 
    newRef DESC 
LIMIT 
    0, 25; 
+0

谢谢您的答复。我试了一下,但有一个错误。 'LEFT JOIN( SELECT COUNT(ID)newRef FROM成员 WHERE REF_ID> 0 AND registrationDate '之间2011.11.04 00:00:00' AND '2011.11.04 23时59分59秒' GROUP BY REF_ID )M 2 在m2.ref_id上的m2.ref_id = m.id'上找不到列。我在'm2.ref_id = m.id'前添加了'r'成员,并将其改为'r.id = m.ref_id'。仍然不起作用:( – Revenant

+0

是的,当然,这个ref_id字段应该被添加到SELECT列表中,我错过了它,我修改了答案 – Devart

+0

谢谢你的作品像一个魅力和快速添加'newRef> 0'和得到了结果,我一开始并不想使用'JOINS',我不知道这些表会变得多大,所以我只是想避免使用'JOINS',但事实证明我的查询比'JOINS',再次感谢你。 – Revenant