0

ロケーションとパイロットという 2 つのテーブルがあります。location_id に基づいてデータを取得しようとしています。つまり、特定の location_id 順で飛行しているパイロットを日付 (スケジュールの日付) で選択しています。

個別のパイロットのみを表示する必要があるため、group by を使用しています。

select  B.*, 
    A.rather_to_be_flying_now,
    A.here_now,
    A.flying,
    A.when,
    A.my_favorite,
    A.start,
    A.end,
    A.Locationid
from locations A 
inner join pilots B 
    on A.Pilotid=B.pilot_id 
where A.VenueID='$venueid' 
    and (A.flying='1' or A.here_now='1') 
group by A.Pilotid 
ORDER BY A.start

group by 句を含めない場合、クエリはうまく機能します。次の結果を返します

group by 句なし ここに画像の説明を入力

group by 句を使用 ここに画像の説明を入力

しかし、上記の表は間違った順序を示しています。出力は、パイロット ID 1 の開始時刻を2013-01-24 02:00:00として返す必要があるためです (時系列順)。

4

3 に答える 3

2

使用できますMIN()

select  B.*, 
    A.rather_to_be_flying_now,
    A.here_now,
    A.flying,
    A.when,
    A.my_favorite,
    MIN(A.start) as start,
    A.end,
    A.Locationid
from locations A 
inner join pilots B 
    on A.Pilotid=B.pilot_id 
where A.VenueID='$venueid' 
    and (A.flying='1' or A.here_now='1') 
group by A.Pilotid 
ORDER BY A.start
于 2013-01-22T15:41:13.577 に答える
1

このクエリを試してください -

SELECT
  p.pilit_id, l.location_id, l.start
FROM pilots p
  JOIN (SELECT l1.*
        FROM locations l1
        JOIN (SELECT location_id, MIN(start) start
              FROM locations
              GROUP BY locations) l2
        ON l1.id = l2.id AND l1.start = l2.start
        ) l
    ON l.pilot_id = p.pilot_id
GROUP BY p.pilot_id

WHERE 条件を追加します。

于 2013-01-22T15:42:29.927 に答える
1

代わりにこれを試してください:

SELECT
  B.*,
  A.rather_to_be_flying_now,
  A.here_now,
  A.flying,
  A.when,
  A.my_favorite,
  A.start,
  A.end,
  A.Locationid
FROM locations A 
INNER JOIN
(
   SELECT pilotid, MIN(start) MinStart
   FROM locations
   GROUP BY pilotid
) a2  ON A.pilotId = a2.pilotId
     AND a.start   = a2.minStart 
INNER JOIN pilots B on A.Pilotid = B.pilot_id 
WHERE A.VenueID = '$venueid' 
  AND (A.flying='1' OR A.here_now='1');
ORDER BY A.start ;

これにより、開始日が最短のパイロットのみが表示されます。

于 2013-01-22T15:37:19.273 に答える