繁体   English   中英

复杂的SQL查询问题

[英]Complicated SQL Query Question

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

该查询返回项目的瓦特反馈计数,该计数在最近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。

我的数据库方案:

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,则项目的自由职业者专家就是该用户。 另外projects.project_owner_id是确定关系的另一列。

我该如何修复我的查询? 谢谢。

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

总是如此: 99(与项目无关的用户),

这就是为什么您“仍然返回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系统。 随意纠正我上面的格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM