2013-08-30 55 views
0

我需要帮助来构建查询。问题是,我没有权限对数据库进行设计更改。考虑到这一点,我的表是这样的:复杂的跨表查询

​​
ID
日期
LastStory
UserAssignedTo

Stories
ID
ProblemID
UserThatMadeTheStory
DateOfStory
状态

数据如何存储: 系统上的任何用户都可以创建一个“问题”。每次创建问题时,还会在表格Stories上插入一行,链接到Problems表的“ProblemID”,状态为“2”,并将“UserThatMadeTheStory”分配给产生“问题”的实际用户”。 稍后,问题将“重新分配给”其他用户。这个过程创建一个“故事”条目,并带有描述和“UserThatMadeTheStory”更改为指定它的用户,同时在“Problems”表中将“UserAssignedTo”更改为保存新用户分配至。 然后,要知道世卫组织实际上打开了这个问题,我必须在“故事”中寻找与我想知道的相匹配的“问题ID”的第一条记录。现在

,我的问题是这样的:

我要查找的,可以说,上个月,由用户创建的问题。 查询如何?

编辑:

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用户创建。和还没有得到任何“故事”中让说,“过去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) 
+0

但这并工作按预期。由于一些最小的错误(因为使用“min(id)”作为ID)并且最终的“Where s2.UserThatMadeTheStory”和“s2.DateOfStory”必须更改为“s”,所以我必须对查询进行一些修改。 。S2使用s.UserThatMadeTheStory不会给你回最初提出问题的用户 – Loki

+0

的我已经编辑我的答案 - 给一个尝试.. – StevieG

+0

修正现在的工作作为一个魅力感谢校正 现在。我有一个更大的问题,如果你能帮助我...我 必须列出已创建由X用户问题,而且还没有有任何“故事”中可以说“48小时”(或指定的任何日期) – Loki

0

我想你会想用GROUP BY

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

例如上面应该给你用ProblemID第一ID为每个故事