sqlmulti-table

select last entry for every user multi table example


Given the following tables table message

id message   time_send             
14 "first"   2014-02-10 22:16:31   
15 "second"  2014-02-14 09:35:20
16 "third"   2014-02-13 09:35:47
17 "fourth"  2014-03-10 22:16:31
18 "fifth"   2014-03-14 09:35:20
19 "sixth"   2014-04-12 09:35:47
20 "seventh" 2014-04-13 09:35:47
21 "eighth"  2014-04-14 09:35:47

table message_owner

id message_id owner_id cp_id
1  14         1        4
2  14         4        1
3  15         12       4
4  15         4        12
5  16         4        1
6  16         1        4
7  17         12       4
8  17         4        12
9  18         4        1
10 18         1        4
11 19         12       4
12 19         4        12
13 20         12       1
14 20         1        12
15 21         12       7
16 21         7        12

I want to query the most recent message with every counter party(cp_id) for a given owner. For example for owner_id=4 I would like the following output:

id message   time_send            owner_id  cp_id
18 "fifth"   2014-03-14 09:35:20  4         1
19 "sixth"   2014-02-13 09:35:47  4         12

I see a lot of examples with one table but I am not able to transpose them in a multitable example.

edit1: adding more entries


Solution

  • This should work:

    SELECT m.id, m.message, mo.owner_id, mo.cp_id
       FROM message m
       JOIN message_owner mo ON m.id=mo.message_id
       WHERE mo.owner_id=4
       AND   m.time_send=(
          SELECT MAX(time_send)
          FROM message m2
          JOIN message_owner mo2 ON mo2.message_id=m2.id
          WHERE mo2.owner_id=mo.owner_id
          AND   mo2.cp_id   =mo.cp_id
       )
    

    ... notice though that putting a WHERE condition on a timestamp column can sometimes not work correctly.

    Same example without jointures:

    SELECT m.id, m.time_send, m.message, mo.owner_id, mo.cp_id
    FROM message m, message_owner mo
    WHERE m.id        = mo.message_id
    AND   mo.owner_id = 4   
    AND   m.time_send = (
       SELECT MAX(time_send)
       FROM message m2, message_owner mo2
       WHERE mo2.message_id = m2.id
       AND   mo2.owner_id   = mo.owner_id
       AND   mo2.cp_id      = mo.cp_id
    );
    

    http://sqlfiddle.com/#!2/558d7/4