2016-07-11 2 views
0

Доброе утро!Система сообщений SQL Server с списком разговора

Я разработал веб-приложение, чтобы люди могли обмениваться сообщениями.

Я использую SQL Server 2008 и классический ASP для Windows 2012 Server.

Для упрощения предположим, что есть только две таблицы:

tUsers 
    Id INT IDENTITY(1,1) 
    Username VARCHAR(20) 

tMessages 
    Id INT IDENTITY(1,1) 
    UserIdFrom INT 
    UserIdTo INT 
    SentDate DATETIME 
    Message VARCHAR(300) 
    Read TINYINT 

Мой вопрос прост, но я не могу найти решение, специфичную для MS SQL.

Мне нужно написать запрос, который возвращает список разговора между мной и другими пользователями, с которыми я разговаривал.

Список должен содержать UserId и Имени (не мои, а из пользователей я говорил с) и должен быть в обратном порядке отправленного порядке даты/времени, и должен включать в себя сообщение (от или ко мне) без ответа (например, Whatsapp).

Я нашел много решений, но для MySQL преобразование в MS SQL не работает. Это первый раз, когда мне нужна помощь по SQL, но я не могу найти решение самостоятельно.

Может ли кто-нибудь дать мне пример запроса T-SQL для решения моей проблемы ???

Извините за мой английский, я говорил на итальянском языке.

Это мой второй вопрос о StackOverflow. Надеюсь, я соблюдал правила.

Заранее спасибо.

+0

Если у вас есть запрос, который работает в MySql, было бы хорошо, чтобы включить, что в вашем вопросе - там не должно быть много изменений в MSSQL – Jamiec

+0

SQLFiddle дает мне ошибку при создании таблицы ... могу ли я использовать IDEONE.COM вместо этого? Для вас то же самое? – danylele

ответ

0
SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
FROM tMessages m 
INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
WHERE (t1.Username = 'danylele' AND t2.Username = 'yourFriend') OR 
     (t1.Username = 'yourFriend' AND t2.Username = 'danylele') 
ORDER BY m.SentDate DESC 

Если вы хотите идентификатор пользователя вместо имени пользователя, вы можете просто использовать этот WHERE пункт:

WHERE (t1.Id = 'yourId' AND t2.Id = 'friendId') OR 
     (t1.Id = 'friendId' AND t2.Username = 'yourId') 
+0

@Jamiec Обновлено мой запрос. Надеясь, что это не приведет к бесконечному обмену комментариями, возможно, включая нисходящее движение по пути. –

+0

Это не получает весь список разговоров между мной и всеми другими пользователями, с которыми я общаюсь, и мне нужно использовать мой UserId, а не Username в запросе. – danylele

0

С H/T, чтобы вы @ Тим взять его запрос, и объединение его с наоборот, чтобы получить сообщения в и от другого человека:

Если вы хотите, чтобы получить список всех * разговоров вы имели вы могли бы использовать такой запрос

DECLARE @myUserId INT = 1 
SELECT DISTINCT Id, Username 
FROM 
(
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t1.Id = @myUserId 
    UNION 
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t2.Id = @myUserId 
) 
ORDER BY SentDate DESC 

Если вы хотите, чтобы все сообщения в определенном использовании разговор:

DECLARE @myUserId INT = 1 
DECLARE @friendUserId INT = 2 
SELECT * FROM 
(
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t1.Id = @myUserId AND t2.Id = @friendUserId 
    UNION 
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t1.Id = @friendUserId AND t2.Id = @myUserId 
) 
ORDER BY SentDate DESC 
+0

Осторожно: ваш заказ может не сохраниться в 'UNION'. –

+0

@TimBiegeleisen yep, это было небрежно. – Jamiec

+0

Мне нужно получить весь список моих разговоров, а не только с одним пользователем, например с чат-чатом Whatsapp, со всеми пользователями, с которыми я общаюсь.Кажется, что у вашего SQL есть только один пользователь (указанный с помощью friendUserId). – danylele

Смежные вопросы