Условный SQL SELECT - когда возвращаемый набор пуст, выполнить другой SELECT? - PullRequest
3 голосов
/ 27 сентября 2011

У меня есть веб-страница, на которой хранятся ее «страницы / статьи» в базе данных MySQL. Он также имеет функцию, чтобы показать другое боковое меню для разных страниц. Все это (меню, пункты меню) хранится в БД.

Вот мой 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?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Возможно, это не самый элегантный способ:

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"
    )

Примечание. Число NULL должно совпадать с числом столбцов в таблице страниц .

2 голосов
/ 27 сентября 2011

Вы можете использовать функцию 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)

Возможно, есть более элегантные способы сделать это, но надеюсь, что это поможет.

...