0

MySQL テーブルに EventStart と Distance の 2 つの列があります。EventStart は、イベントの開始時刻を表す DateTime ですが、Distance は、イベントまでのマイル数とそこに到達するまでの時間を組み合わせた文字列です (「126.2 マイル / 2 時間 35 分」など)。

イベントのために LEAVE する必要がある場合に応じて、テーブルの内容を出力したいと思います。つまり、EventStart から Distance 値の右半分 (「/」マークの後のすべて) を減算します。結果を出発時刻順に並べたいので、結果を反復するときに単純に印刷します。

PHP では、これはかなり簡単です。

$distance = substr($row['Distance'], strrpos( $row['Distance'],'/')+1);
$result = date('j M - g:i a', strtotime($row['EventStart']." -".$distance));

しかし、10 時から 1 時間先のイベントが 1 つと、11 時から 3 時間先のイベントが 1 つある場合、MySQLORDER BY EventStartを使用すると、8 時より前に 9 時がリストされてイベントが表示されます。正しくない。

何百ものエントリが存在する可能性があるため、2D PHP 配列を作成してそれをソートすることは避けたいので、MySQL クエリで直接実行することを検討しています。これにより、2つの部分からなる質問になると思います。

  1. 距離の計算で "/" マークの後のすべてを選択するにはどうすればよいですか?
  2. 計算された距離で注文できるように、EventStart からその値を減算するにはどうすればよいですか?

最後の注意: この方法で距離を保存するのは間違いであることはわかっています。私は他の誰かからプロジェクトを取り上げています。

助けてくれてありがとう!

4

2 に答える 2

1

まあ、それは少し楽しかったです。そもそもこのスキーマを作成した人物を見つけて、彼らにふさわしい愛を示すことを願っています。

このようなものがうまくいくはずです。各ステップをもう少し読みやすくするために、サブクエリに分割したと思います。

SELECT miles, hours + minutes FROM (
SELECT
  cast(left(Distance, first_space) AS DECIMAL(5,2)) AS miles,
  cast(substr(Distance, distance_split_loc+1, hour_loc-distance_split_loc-1) AS unsigned) * 60 AS hours,
  cast(IF (hour_loc = 0,
    substr(Distance, distance_split_loc+1, min_loc-distance_split_loc-1),
    substr(Distance, space_after_hour, min_loc-space_after_hour)) AS unsigned) AS minutes
FROM
(SELECT
   Distance,
   locate(' ', Distance) first_space,
   locate('/', Distance) distance_split_loc,
   locate('hour', Distance) AS hour_loc,
   locate('min', Distance) AS min_loc,
   locate(' ',Distance,locate('hour', Distance)) AS space_after_hour
 FROM distance) AS temp_table) AS timecalc
ORDER BY miles;

SQLFiddle へのリンク

于 2013-06-18T18:39:34.547 に答える