根据外键选择每一行的前一行

时间:2014-11-15 23:45:10

标签: mysql codeigniter

如何列出每个外键列中唯一的最新一行。

EG。 我有一张下面的儿童表:

mysql> select tstatus_id,trip_id,trip_title,trip_id from trip_history_status;
+------------+---------+-------------+ 
| tstatus_id | trip_id | trip_title  | 
+------------+---------+-------------+ 
|         33 |      35 | Jitesh Trip |  
|         34 |      36 | Test_trip   | 
|         35 |      36 | Test_trip1  | 
|         36 |      36 | Test_trip2  |
|         37 |      36 | Test_trip3  | 
+------------+---------+-------------+ 

其中,

  • tstatus_id =表trip_history_status
  • 的主键(自动绑定)
  • trip_id =父表tripdetails
  • 中的外键

预期输出

+------------+-------------+---------+
| tstatus_id | trip_title  | trip_id |
+------------+-------------+---------+
|         33 | Jitesh Trip |      35 |
|         37 | Test_trip3  |      36 |
+------------+-------------+---------+

但我无法思考如何解决这个问题,我得到这样的输出:

mysql> SELECT  tstatus_id,trip_history_status.trip_title,tripdetails.trip_id
    -> FROM (`trip_history_status`)
    -> JOIN `tripdetails` ON `tripdetails`.`trip_id` = `trip_history_status`.`trip_id`
    -> GROUP BY `tripdetails`.`trip_id`
    -> ORDER BY `tstatus_id` Asc;
+------------+-------------+---------+
| tstatus_id | trip_title  | trip_id |
+------------+-------------+---------+
|         33 | Jitesh Trip |      35 |
|         34 | Test_trip   |      36 |
+------------+-------------+---------+ 

2 个答案:

答案 0 :(得分:2)

您需要分两个阶段完成此操作。首先,确定每个不同tstatus_id的最高trip_id值,如下所示。 http://sqlfiddle.com/#!2/f7884/1/0

         SELECT MAX(tstatus_id) AS tstatus_id, trip_id
           FROM trip_history_status
          GROUP BY trip_id

然后将其加入原始表格,如下所示http://sqlfiddle.com/#!2/f7884/2/0

SELECT a.tstatus_id, a.trip_title, a.trip_id
  FROM trip_history_status AS a
  JOIN (
         SELECT MAX(tstatus_id) AS tstatus_id, trip_id
           FROM trip_history_status
          GROUP BY trip_id
       ) AS b ON a.tstatus_id = b.tstatus_id

MAX() ... GROUP BY...的第一个查询确定每次旅行的最新ID。然后,您将其加入主表以检索其他信息(trip_title)。连接操作用于消除任何没有特定行程的最新值集合中的id值的行。

此查询以稍微不同的方式执行相同的操作:http://sqlfiddle.com/#!2/f7884/3/0

SELECT tstatus_id, trip_title, trip_id
  FROM trip_history_status
 WHERE tstatus_id IN (
         SELECT MAX(tstatus_id) AS tstatus_id
           FROM trip_history_status
          GROUP BY trip_id
       ) 

答案 1 :(得分:0)

尝试此查询:

SELECT * FROM trip_history_status ths,(SELECT trip_id,MAX(tstatus_id)AS tstatus_id FROM trip_history_status GROUP BY trip_id)tmp 在哪里tmp.tstatus_id = ths.tstatus_id

您可以使用此SQL Fiddle http://sqlfiddle.com/#!2/aa834/3

对其进行测试

此致