3

このクエリを使用して、mysql イベント テーブルの次のイベントと前のイベントの ID を取得します。

SELECT e.id AS current, prev.id AS previous, next.id AS next
FROM events e
CROSS JOIN 
(
    SELECT id FROM events 
    WHERE date < '{$result['date']}' 
    ORDER BY date DESC 
    LIMIT 1
) prev
CROSS JOIN 
(
    SELECT id
    FROM events 
    WHERE date > '{$result['date']}' 
    ORDER BY date 
    LIMIT 1
) next
WHERE e.date = '{$result['date']}'

このクエリは正常に機能します。

テーブルが次のようになっているとしましょう。

ID | EVENT_NAME   | DATE
------------------------------
1  | test event 1 | 2012-01-01
2  | test event 2 | 2012-01-02
3  | test event 3 | 2012-02-03

$result['date']asでクエリを実行すると、次の2012-01-02ように返されます。

Array
(
    [0] => Array
    (
        [current] => 2
        [previous] => 1
        [next] => 3
    )
)

$result['date']ただし、 as 2012-01-01ORでクエリを実行すると2012-01-03、空の結果セットが返されます!

渡された日付が最高または最低であるために前または次の日付が存在しない場合でも、次または前の日付を返すには結果セットが必要です

例えば

したがって、$result['date']as2012-01-01でクエリを実行すると、結果セットが必要になります。

Array
(
    [0] => Array
    (
        [current] => 1
        [next] => 2
    )
)

OR

Array
(
    [0] => Array
    (
        [current] => 1
        [previous] => NULL
        [next] => 2
    )
)
4

2 に答える 2

3

1=1 で LEFT JOIN を使用できます

SELECT e.id AS current, prev.id AS previous, next.id AS next 
FROM events e 
LEFT JOIN  
( 
    SELECT id FROM events  
    WHERE date < '{$result['date']}'  
    ORDER BY date DESC  
    LIMIT 1 
) ON prev 1=1 
LEFT JOIN  
( 
    SELECT id 
    FROM events  
    WHERE date > '{$result['date']}'  
    ORDER BY date  
    LIMIT 1 
) ON next 1=1 
WHERE e.date = '{$result['date']}' 
于 2012-07-13T11:41:01.087 に答える
1

サブクエリを使用できます。

SELECT e.id AS current, 
(
    SELECT id 
    FROM events 
    WHERE date < '{$result['date']}' 
    ORDER BY date DESC 
    LIMIT 1
) AS previous,
(
    SELECT id
    FROM events 
    WHERE date > '{$result['date']}' 
    ORDER BY date 
    LIMIT 1
) AS next
FROM events e
WHERE e.date = '{$result['date']}'
于 2012-07-13T11:50:40.463 に答える