2010-12-17 76 views
0

我正在开发自由职业者站点,并且在此站点中,用户(项目所有者和专家)可以为每个站点留下反馈。我试图找到等待离开的反馈数量。复杂的SQL查询问题

该查询返回项目的这些在过去30天内没有反馈,用户ID = 3,并有适当的状态代码watting反馈计数:

SELECT COUNT(*) 
FROM projects 
WHERE projects.status IN (5, 10) AND projects.status_created >= DATE_SUB('2010-12-17 21:24:51', INTERVAL 30 DAY)  
AND NOT EXISTS(
    SELECT * FROM 
    feedbacks WHERE feedbacks WHERE projects.id = feedbacks.project_id AND feedbacks.from_id = '3' 
) 

此查询的作品时,我们只有2个在数据库中的用户否则,例如,如果我们改变用户ID 3到99(用户具有与项目没有关系),查询仍返回1计数,但应该返回0

我的数据库方案:

PROJECTS(id, project_owner_id, project_title, ...) 
FEEDBACKS(id, project_id, to_id, from_id, ....) 
PROJECT_BIDS(id, project_id, bid_owner_id, accepted, ...) We can use this table for find out which user's bid is accepted then accepted bid owner have right for leave feedback. 

我们可以使用project_bids.accepted字段来找出哪些用户与项目有关系。如果被接受为真,那么项目的自由职业者专家就是这个用户。另外projects.project_owner_id是确定关系的另一列。

我该如何解决我的问题?谢谢。

+2

也许一个自由职业者可以帮忙吗? – 2010-12-17 20:44:36

+1

如果您为每个表格提供了样本数据,那么您对表格之间关系的解释将更加清晰,以显示哪些内容无效。 – Gerrat 2010-12-17 21:05:59

回答

1

您的查询(书面)正在寻找因为在过去30天内创建的项目数量已经附加了评论/反馈,并且该人员对该项目进行了评论。

突出的第一件事是您正在检查投影的创建日期,而不是评论/反馈的日期。如果你这样做,当项目变得超过30天时,在运行查询时不会再有反馈。您很可能会希望将时间戳添加到反馈表,并检查该字段。

此外,您正在计算项目数量,而不是满足条件的反馈数量。

对于你的查询,我会尝试这样的:

SELECT COUNT(feedbacks.id) 
FROM feedbacks, projects 
WHERE 
    projects.id = feedbacks.project_id AND 
    projects.status IN (5, 10) AND 
    feedbacks.timestamp >= DATE_SUB('2010-12-17 21:24:51', INTERVAL 30 DAY) 
ORDER BY projects.id 

这会发现每个每个项目反馈次数(给定状态)。如果你想只计算由谁中标人分别给予了反馈,你可以添加到WHERE子句:

AND feedbacks.from in ( 
    SELECT project_bids.bid_owner_id 
    FROM project_bids 
    WHERE 
     project_bids.accepted = 1 AND 
     project_bids.project_id = projects.id 
) 

你的英语有点难以理解,所以请澄清我误解的东西。

给其他人的提示:我仍然试图习惯Mark Down系统。随意纠正我上面的格式。

+0

这个答案引导我写出正确的查询。谢谢 – mTuran 2010-12-18 22:24:24

1
NOT EXISTS(SELECT FROM ...feedbacks.from_id = '99') 

始终是真实的:99(用户具有与项目没有关系),

这就是为什么你«仍然回报1»

+0

您忘记了第一个(有效)条件:_SELECT * FROM feedbacks WHERE projects.id = feedbacks.project_id AND feedbacks。from_id ='3'_如果该行与正确的项目不匹配,则说明它不会匹配用户。 – BryanH 2010-12-17 22:41:10

+0

第一个条件不相关 – renegm 2010-12-17 23:18:16

+0

用下面的语句测试你的查询:NOT EXISTS(SELECT * FROM feedbacks WHERE 1 = 2) – renegm 2010-12-17 23:20:17