0

列車のあるテーブルのデータ構造は次のとおりです。

 from | to | connection_id | date
------+----+---------------+------
  A   | B  | 1             | some
  B   | C  | 1             | dates
  B   | D  | 2             | I can
  D   | E  | 2             | sort
  E   | C  | 2             | by

そして、connection_id列でデータをグループ化したいのですが、必要な結果は次のとおりです。

 from | to | connection_id
------+----+---------------
  A   | C  | 1            
  B   | C  | 2            

したがって、グループ化された行の最初の行のfrom-valueと、グループ化された行の最後の行のto-valueが必要です。最後と最初の行を取得するために、並べ替える日付列があります。グループ化された行の最初/最後の行から1つの値を取得するにはどうすればよいですか?

編集:明確化のために:connection_idごとに、日付値が最も低い行のfrom-valueと、date-valueが最も高い行のto-valueを取得します。

4

2 に答える 2

3

行をフィールドで並べ替えることができる場合date、これを使用できると思います:

select t1.`from`, t2.`to`, mm.connection_id
from (
  select connection_id, min(`date`) as minDate, max(`date`) as maxDate
  from trains
  group by connection_id) mm
  inner join trains t1 on mm.connection_id=t1.connection_id and t1.`date`=mm.minDate
  inner join trains t2 on mm.connection_id=t2.connection_id and t2.`date`=mm.maxDate

ここでは、すべての connection_id の最初と最後の行を選択し、最初のfrom行から列を取得し、最後の行から列を取得していますto。または、次のトリックを使用することもできます。

select
  SUBSTRING_INDEX(GROUP_CONCAT(`from` ORDER BY `date`), ',', 1 ) as `from`,
  SUBSTRING_INDEX(GROUP_CONCAT(`to` ORDER BY `date`), ',', -1 ) as `to`,
  connection_id
from trains
group by connection_id
于 2013-01-01T17:45:53.727 に答える
1

order byで2つ試してselectみることができunionます。次のように:

Select * from yourtable 
group by connection_id
order by [from] desc limit 1
union
select * from yourtable
group by connection_id 
order by [to] asc limit 1
于 2013-01-01T17:34:18.547 に答える