2013-08-30 2 views
0

Мне нужна помощь в построении запроса. Проблема в том, что у меня нет прав на внесение изменений в конструкцию базы данных. Имея это в виду, мои таблицы выглядит следующим образом:Сложный кросс-табличный запрос

Problems
ID
Дата
LastStory
UserAssignedTo

Stories
ID
ProblemID
UserThatMadeTheStory
DateOfStory
Статус

Как хранятся данные: Любой пользователь системы может создать «проблему». Каждый раз, когда создается проблема, также есть строка, вставленная в таблицу «Истории», ссылающаяся на «ProblemID» в таблице «Проблемы» с статусом «2» и с «UserThatMadeTheStory», назначенной фактическому пользователю, который сделал «Проблему ». Позже проблема «Reasigned» для других пользователей. Этот процесс Создает запись «Истории» с описанием и с помощью «UserThatMadeTheStory», измененной для пользователя, который ее назначил, в то же время в таблице «Проблемы» заменяется «UserAssignedTo» для сохранения нового пользователя к. Затем, чтобы узнать, что ВОЗ действительно открыла проблему, я должен искать первую запись в «Истории», которая имеет «Проблемную ошибку», соответствующую той, которую я хочу знать.

Теперь проблема у меня есть это:

У меня есть для поиска для, позволяет сказать, в прошлом месяце, проблемы, созданные пользователем. Как это будет запрос?

EDIT:

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. И Havent есть какие-либо «истории» в Lets говорят «Последние 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> 

EDIT:

На самом деле, некоторые ошибки в вышеупомянутом 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> 

Edit 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

Этот DID работает по назначению. Я должен был внести некоторые изменения в запрос из-за некоторых минимальных ошибок (используя «min (id) в качестве идентификатора), а окончательное« Where s2.UserThatMadeTheStory »и« s2.DateOfStory »нужно было заменить на« s ». из s2 – Loki

+0

с использованием s.UserThatMadeTheStory не даст вам обратно пользователя, который изначально поднял проблему. Я отредактировал свой ответ - дайте попробовать. – StevieG

+0

Исправлено. Работаю в качестве очарования. Спасибо за исправление. Теперь у меня есть большая проблема. Если вы можете мне помочь ... Мне нужно пересмотреть проблемы, которые были созданы пользователем X. И HAVENT получили ЛЮБОЕ «рассказы» в let say «48hours» (или любая дата указана) – Loki

0

Я думаю, что вы хотите использовать GROUP BY

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

, приведенное выше, например, должно предоставить вам первый идентификатор с идентификатором проблемы для каждой истории.