【问题标题】:select top one row each based on foreign key根据外键选择前一行
【发布时间】:2014-11-15 23:45:10
【问题描述】:

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

例如。 我有一个下面的子表:

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 |
+------------+-------------+---------+ 

【问题讨论】:

    标签: mysql codeigniter


    【解决方案1】:

    您需要分两个阶段执行此操作。首先,确定每个不同trip_id 的最高tstatus_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
           ) 
    

    【讨论】:

      【解决方案2】:

      试试这个查询:

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

      您可以使用此 SQL Fiddle http://sqlfiddle.com/#!2/aa834/3 对其进行测试

      问候,

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        相关资源
        最近更新 更多