2011-09-27 65 views
3

我有一個網頁,其「頁/文章」存儲在MySQL數據庫中。它還具有爲不同頁面顯示不同側面菜單的功能。所有這些(菜單,菜單項)都存儲在數據庫中。條件SQL SELECT - 當返回集爲空時,執行另一個SELECT?

這是我爲獲得所有菜單項爲當前頁面SQL:

SELECT * 
FROM menu_items 
    JOIN pages 
    ON menu_items.menu_id=pages.right_menu_id 
WHERE pages.link = "some_link" 

和它的作品。

我想要的是,當這個查詢返回一個空集時,執行另一個查詢並得到它的結果。可能嗎 ??如果上面提到的查詢爲空,我想獲得這個查詢的結果是:

SELECT * 
FROM menu_items 
WHERE menu_id=2; 

是否有可能,或者我應該只是做它在PHP?

+3

你可以找到一種方法來做到這一點(例如聯合,或子查詢),但我認爲你應該在PHP中做到這一點。 – derobert

+0

是的,在我看到解決方案之後,我只會用PHP做:) – xx77aBs

回答

2

您可以使用EXIST函數測試當前頁面是否有任何鏈接:

IF EXISTS(SELECT menu_id FROM menu_items JOIN pages ON menu_items.menu_id = pages.right_menu_id WHERE pages.link = "some_link") THEN 

    SELECT * 
    FROM  menu_items 
      JOIN pages 
       ON menu_items.menu_id=pages.right_menu_id 
    WHERE pages.link = "some_link" 

ELSE 

    SELECT * 
    FROM  menu_items 
      JOIN pages 
       ON menu_items.menu_id=pages.right_menu_id 
    WHERE menu_id = 2 

END IF 

您也可以嘗試這樣的事:

DECLARE @LinkCount INT 
SELECT @LinkCount = COUNT(*) FROM menu_items JOIN pages ON menu_items.menu_id = pages.right_menu_id WHERE pages.link = "some_link" 

SELECT * 
FROM  menu_items 
     JOIN pages 
      ON menu_items.menu_id=pages.right_menu_id 
WHERE (@LinkCount > 0 AND pages.link = "some_link") OR (@LinkCount = 0 AND menu_id = 2) 

有可能會做的更優雅的方式這個,但希望這有助於。

+0

謝謝!很高興知道它是如何完成的,但我認爲PHP解決方案更加優雅和可讀,所以我將在PHP中實現它;) – xx77aBs

2

也許這還不是最優雅的方式:

SELECT * 
FROM 
    menu_items 
    JOIN pages ON menu_items.menu_id = pages.right_menu_id 
WHERE pages.link = "some_link" 

UNION ALL 

SELECT *, NULL, NULL, NULL 
FROM menu_items 
WHERE 
    menu_id = 2 AND 
    NOT EXISTS (
     SELECT * 
     FROM 
      menu_items 
      JOIN pages ON menu_items.menu_id = pages.right_menu_id 
     WHERE pages.link = "some_link" 
    ) 

注:空值數應該是相同的列數表頁。

+0

謝謝:D但是這只是讓我害怕:D – xx77aBs