0

我需要帮助来构建查询。问题是,我无权对数据库进行设计更改。考虑到这一点,我的表格如下所示:

Problems
ID
日期
LastStory
UserAssignedTo

Stories
ID 问题ID
UserThatMadeTheStory
DateOfStory 状态


数据如何存储:系统上的任何用户都可以创建“问题”。每次创建问题时,还会在 Stories 表上插入一行,链接到 Problems 表的“ProblemID”,状态为“2”,并将“UserThatMadeTheStory”分配给产生“问题”的实际用户”。后来,问题是“重新分配”给其他用户。此过程创建一个“Stories”条目,其中包含描述并将“UserThatMadeTheStory”更改为分配它的用户,同时在“Problems”表中更改“UserAssignedTo”以保存分配的新用户至。然后,要知道谁实际上打开了问题,我必须在“Stories”中查找具有“ProblemID”的第一条记录

现在,我遇到的问题是:

我必须查找,比如说,上个月,用户创建的问题。查询将如何?

编辑:

SELECT s.* 
FROM stories s
INNER JOIN (SELECT problemid, min(id) AS Id FROM stories GROUP BY problemid) s2 ON s.id = s2.id
INNER JOIN (SELECT UserThatMadeTheStory, DateOfStory, Id FROM stories) s3 ON s2.id = s3.id
WHERE s3.UserThatMadeTheStory = <the one you're interested in>
AND s3.DateOfStory = <dates you're interested in>

这确实按预期工作,现在我没有其他问题......

如果你能帮助我...我必须列出 X 用户创建的问题。AND HAVENT 有任何“故事”让我们说“过去 2 天”(或指定的任何日期 [它可以是查询的外部输入])

4

2 回答 2

0
SELECT s.* 
FROM stories s
INNER JOIN (SELECT problemid, min(id) FROM stories GROUP BY problemid) s2 ON s.id = s2.id
WHERE s2.UserThatMadeTheStory = <the one you're interested in>
AND s2.DateOfStory = <dates you're interested in>

编辑:

实际上,上述 SQL 中存在一些错误 - 对此感到抱歉。我已经修改了它,所以它现在应该可以工作了。请注意,我必须添加第三个连接以确保您获得首次记录问题的用户/日期:

SELECT s.* 
FROM stories s
INNER JOIN (SELECT problemid, min(id) AS Id FROM stories GROUP BY problemid) s2 ON s.id = s2.id
INNER JOIN (SELECT UserThatMadeTheStory, DateOfStory, Id FROM stories) s3 ON s2.id = s3.id
WHERE s3.UserThatMadeTheStory = <the one you're interested in>
AND s3.DateOfStory = <dates you're interested in>

编辑2:

对于您的新问题(实际上应该发布在新问题上):

SELECT p.* 
FROM stories s
INNER JOIN (SELECT problemid, min(id) AS Id FROM stories GROUP BY problemid) s2 ON s.id = s2.id
INNER JOIN (SELECT UserThatMadeTheStory, DateOfStory, Id FROM stories) s3 ON s2.id = s3.id
INNER JOIN problems p ON s.problemid = p.id
WHERE s3.UserThatMadeTheStory = <the one you're interested in>
AND NOT EXISTS (SELECT 1 FROM stories s4 WHERE s4.problemid = p.id AND s4.id <> s2.id AND DATEDIFF(dd,s4.DateOfStory,GETDATE()) <= 2)
于 2013-08-30T11:59:55.537 回答
0

我想你会想用GROUP BY

SELECT 
    MIN(ID),
    MIN(ProblemID)
FROM
    Stories
GROUP BY
    ID,
    ProblemID

上面的例子应该给你每个故事的 ProblemID 的第一个 ID

于 2013-08-30T12:01:09.660 回答