Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 321
  • Last Modified:

SQL selection query question

Hi,

I was wondering if anyone can tell me how to do the following using sql transact for sql server 2008.

I want to select all records in a couple of linked tables where UserId = @UserId AND ThreadId has to be the most recent one and has to be distinct.  

For example user can have many threads but also a lot of messages on the same thread.  On the main page I just want to see the most recent message in that thread plus all the other most recent message in different threads.

Thank you
0
Claudiu10
Asked:
Claudiu10
  • 6
  • 3
1 Solution
 
SharathData EngineerCommented:
try like this.
select * 
  from (
select *,row_number() over (partition by UserID order by ThreadID desc) rn
  from your_table) t1
 where rn = 1 and UserID = @UserID

Open in new window

0
 
LowfatspreadCommented:
you need to tell us the structure of your tables and the volumes involved ....

however



select x.Threadid
      ,x.ThreadTopic
      ,x.msgid
      ,x.msgresponse
      ,x.msgtime
      ,x.msguser
  from (select the columns that you want....
              ,row_number() over (partition by t.threadid order by m.msgtime desc) as rn
     -- could be a msg sequence number instead of the msg date and time ... whatever indicates
     -- the latest messages should be in the above order by  xxxxx desc
  from threads as T
 left outer join Messages as M
   on t.threadid=m.threadid
  where t.userid=@userid
    ) as X
 where rn=1
 order by threadid,....

Open in new window

0
 
Claudiu10Author Commented:
HI,

thanks for the info.  I tried this.  Any idea why it's giving me incorrect column rownum?

SELECT (ow_number() over (PARTITION by t.ThreadId order by m.CreateDate DESC) AS rownum, t.ThreadId, t.ThreadSubject, m.MessageId, m.SentByUserId, m.Body, m.CreateDate, m.MessageTypeId, r.UserId, r.MessageStatusTypeId, r.DateLastModified
      FROM Messages AS m INNER JOIN
MessageThread AS t ON m.ThreadId = t.ThreadId INNER JOIN
            MessageRecipients AS r ON m.MessageId = r.MessageId
                  WHERE rownum = 1 AND r.UserId = @UserId

Thank you
0
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
SharathData EngineerCommented:
try like this.
SELECT * 
  FROM (SELECT ROW_NUMBER() 
                 OVER(PARTITION BY t.ThreadId ORDER BY m.CreateDate DESC) AS rownum, 
               t.ThreadId, 
               t.ThreadSubject, 
               m.MessageId, 
               m.SentByUserId, 
               m.Body, 
               m.CreateDate, 
               m.MessageTypeId, 
               r.UserId, 
               r.MessageStatusTypeId, 
               r.DateLastModified 
          FROM Messages AS m 
               INNER JOIN MessageThread AS t 
                 ON m.ThreadId = t.ThreadId 
               INNER JOIN MessageRecipients AS r 
                 ON m.MessageId = r.MessageId) t1 
 WHERE rownum = 1 
       AND UserId = @UserId

Open in new window

0
 
Claudiu10Author Commented:
Thanks for your help.  Appreciate it.
0
 
Claudiu10Author Commented:
Hi,

Actually there is a problem in my case with this statement.  

I am trying to get all the messages received by a user by the following criteria:

1.  Different thread.
2.  Newest
3.   The user getting the messages can't be the sender.

Problems with this query:

The partitioning does not guarantee that rownum 1 doesn't contain the user reading the messages as the sender.  I don't see a way to put in a where clause in the partition.  Any ideas how I can make that happen?
0
 
Claudiu10Author Commented:
I also tryed partitioning by senders in a second rownumber but that doesn't guarantee the case where there is more than one thread by the same sender.
0
 
Claudiu10Author Commented:
sorry think I got it.

added the following in the where clause at the end of the query before the closing bracket.

WHERE m.SentByUserId <> @UserId AND r.UserId = @UserId
0
 
SharathData EngineerCommented:
Are you still looking for any help?
0
 
Claudiu10Author Commented:
no I got it thanks.  I was making a mistake by putting the where clause after the closing bracket initially.

Thank you
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Upgrade your Question Security!

Your question, your audience. Choose who sees your identity—and your question—with question security.

  • 6
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now