2012-07-13 104 views
3

我使用此查詢在MySQL事件表,以獲取下一步和上一步活動的ID:如何防止MySQL的交叉聯接查詢返回結果爲零,如果查詢之一返回null

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']2012-01-02查詢,這將返回:

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

但是如果我$result['date']2012-01-01運行查詢OR 2012-01-03,返回空結果集!

如果前一個或下一個日期不存在,因爲傳遞的日期是最高或最低,我還需要將結果集返回下一首或上

E.G.

因此如果我用$result['date']2012-01-01運行查詢,我需要的結果集:

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

OR 

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

回答

3

您可以使用LEFT與1 = 1

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']}' 
+0

這不會害怕,說是'WHERE'附近的語法錯誤,我將它改爲'ON',仍然不工作:( – 2012-07-13 11:47:43

+0

什麼是語法錯誤? – 2012-07-13 11:53:28

+0

@ AlexMorley-Finch表別名在ON子句之前。 – 2012-07-13 11:54:13

1

您可以使用子查詢JOIN:

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']}'