sql >> データベース >  >> RDS >> Mysql

開始から終了までの時間に関するSQL結合テーブル

    少し不格好ですが、私が思いついたのは次のとおりです。

    SELECT
        *
    FROM
        (
            SELECT
                a.ID AS EventID,
                b.ID AS VideoID,
                b.Filename,
                (
                    CASE
                        WHEN a.Time < b.StartTime THEN UNIX_TIMESTAMP(b.StartTime) - UNIX_TIMESTAMP(a.Time)
                        WHEN a.Time > b.EndTime THEN UNIX_TIMESTAMP(a.Time) - UNIX_TIMESTAMP(b.EndTime)
                    END
                ) AS distance_factor
            FROM
                `Events` a
            CROSS JOIN
                video b
            WHERE
                NOT EXISTS
                (
                    SELECT NULL
                    FROM Video
                    WHERE a.Time BETWEEN StartTime AND EndTime
                )
        ) c
    WHERE 
        c.distance_factor = 
        (
            SELECT
                MIN(CASE WHEN d.Time < e.StartTime THEN UNIX_TIMESTAMP(e.StartTime) - UNIX_TIMESTAMP(d.Time) WHEN d.Time > e.EndTime THEN UNIX_TIMESTAMP(d.Time) - UNIX_TIMESTAMP(e.EndTime) END)
            FROM
                `Events` d
            CROSS JOIN
                video e
            WHERE d.ID = c.EventID
        )
    GROUP BY
        c.EventID
    

    これにより、日付がどの動画のどの時間範囲にも当てはまらないイベントが返されますが、そのイベントの日付に最も近い動画が返されます。

    今のところ唯一のことは、秒差がまったく同じであるビデオがいくつかあるということです。 2行を返すかどうかはわかりませんが、今のところ、GROUPBYに入れて1行だけを選択します。

    それがどのように機能するか教えてください。



    1. \dがjdbcプログラムで失敗しました

    2. MySQLの保存期間-データ型?

    3. 休止状態のネイティブクエリでMySQL割り当て演算子(:=)を使用するにはどうすればよいですか?

    4. さまざまな形式での SQL Server の日時比較