2015-11-25 86 views
0

我想通过“contactreply”表订购“contact”表。 “contactreply”表中的“contactid”行是“contact”表中的“ID”行。 “联系方式”必须由“contactreply”表中的最后一个插入物订购,其中“contactid”是表格“contact”中的“ID”。Sql select table by

联系表:

+----+--------+----------+----------+ 
| ID | userid | subject | content | 
+----+--------+----------+----------+ 
| 1 |  1 | subject | subject | 
| 2 |  1 | subject2 | subject2 | 
+----+--------+----------+----------+ 

回复表

+----+--------+-----------+---------+ 
| ID | userid | contactid | content | 
+----+--------+-----------+---------+ 
| 1 |  1 |   1 | reply1 | 
| 2 |  1 |   2 | reply2 | 
| 3 |  1 |   1 | fasd | 
| 4 |  1 |   2 | asdf | 
| 5 |  1 |   2 | f  | 
| 6 |  1 |   1 | asdf | 
+----+--------+-----------+---------+ 

我尽我所能来解释它,希望你理解它;) 我媒体链接看着其他职位,但我不能让它工作。

预先感谢您。

+2

显示您的预期产出,到目前为止你已经尝试了什么。 – Amit

+2

你是什么意思'必须由表中的最后一个插入“contactreply”'命令?合同回复没有时间列,唯一能通过“上一次插入”进行排序的方法似乎是按降序排列合同答复ID ......这是正确的吗? – medveshonok117

+0

@ medveshonok117假设id是自动递增的,那么它具有先天的临时性 – Strawberry

回答

1
SELECT c.* 
    FROM contacts c 
    JOIN reply x 
    ON x.contactid = c.id 
    JOIN 
    (SELECT MAX(id) max_id FROM reply GROUP BY contactid) y 
    ON y.max_id = x.id 
ORDER 
    BY x.id; 
+----+--------+----------+----------+ 
| ID | userid | subject | content | 
+----+--------+----------+----------+ 
| 2 |  1 | subject2 | subject2 | 
| 1 |  1 | subject | subject | 
+----+--------+----------+----------+ 
1

检查,如果这是你所期望的

select a.*, b.id from contact as a 
     inner join 
(select * from contactReply as x 
where x.id = 
      (select max(id) from contactReply as y 
      where x.contactid = y.contactid) 
) as b 
on a.ID = b.contactId 
order by b.id 
+0

请注意,不相关的子查询通常更快。 – Strawberry