我正在开发自由职业者网站,在这个网站上,用户(项目所有者和专家)可以为每个网站留下反馈。我试图找到等待离开的反馈计数。
此查询返回项目的投注反馈计数,该计数在过去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也是另一个确定关系的列。
如何修复查询?谢谢。
答案 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系统。您可以随意更正我上面的格式。