复杂的SQL查询问题

时间:2010-12-17 20:40:41

标签: sql mysql

我正在开发自由职业者网站,在这个网站上,用户(项目所有者和专家)可以为每个网站留下反馈。我试图找到等待离开的反馈计数。

此查询返回项目的投注反馈计数,该计数在过去30天内没有反馈,用户ID = 3且具有合适的状态代码:

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。 / p>

我的数据库方案:

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字段来查找哪些用户与项目有关系。如果接受为true,那么项目的自由职业者专家就是这个用户。 project.project_owner_id也是另一个确定关系的列。

如何修复查询?谢谢。

2 个答案:

答案 0 :(得分:1)

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

始终为真: 99(与项目无关的用户),

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

答案 1 :(得分: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系统。您可以随意更正我上面的格式。