@Shv_sergey

Как лучше составить SQL запрос?

Добрый день! Подскажите, как можно составить SQL запрос с переменной, которая может не содержать значение?
Пример:
//Запрашиваем задачи пользователя по его ID и ID проекта для вывода задач
    $current_tasks_list_query = "SELECT
        tasks.id AS ID,
        tasks.name AS TASK_NAME,
        tasks.deadline_datetime AS TASK_DEADLINE,
        tasks.status AS TASK_STATUS,
        projects.name AS PROJECT_NAME
        FROM tasks 
        JOIN projects
        ON tasks.project_id = projects.id
        WHERE
        tasks.project_id = ".$_SESSION['selected_menu_item_id']." AND
        tasks.author_id = '".$USER['id']."'";

    $current_tasks_items = $mysql->getAssocResult($mysql->makeQuery($current_tasks_list_query));


Переменная $_SESSION['selected_menu_item_id'] - может не содержать значение ID - тогда там будет NULL. Каким образом сказать, получи такие-то данные, где tasks.project_id - любое значение, а если $_SESSION['selected_menu_item_id'] определен, то подставь его.
Как это сделать, используя одно выражение для запроса, а не прописывая для одного запроса выражение со строчкой tasks.project_id = ".$_SESSION['selected_menu_item_id'].", а для другого без нее.

Возможно есть какие-то возможности языка SQL, которые позволяют сделать что-то вроде tasks.project_id = * - что означало бы любое значение?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
@sergmit
Или так:
$project_id = empty($_SESSION['selected_menu_item_id']) ? '' : 
    "tasks.project_id = ".$_SESSION['selected_menu_item_id']." AND";
$current_tasks_list_query = "SELECT
        tasks.id AS ID,
        tasks.name AS TASK_NAME,
        tasks.deadline_datetime AS TASK_DEADLINE,
        tasks.status AS TASK_STATUS,
        projects.name AS PROJECT_NAME
        FROM tasks 
        JOIN projects
        ON tasks.project_id = projects.id
        WHERE
        $project_id
        tasks.author_id = '".$USER['id']."'";
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Hedy
Можно попробовать вот так:
...
WHERE
        1=CASE 
            WHEN ".$_SESSION['selected_menu_item_id']." IS NULL THEN 1
            WHEN tasks.project_id = ".$_SESSION['selected_menu_item_id']." THEN 1
            ELSE 0 
        END
Ответ написан
Комментировать
@ponaehal
Есть всякие полезные функции определения NULL значения типа NVL/NVL2 (Oracle), но подозреваю, что в разных СУБД они реализованы по разному. И все равно общий смысл будет таким:
WHERE
        (tasks.project_id = ".$_SESSION['selected_menu_item_id']." 
AND tasks.author_id = '".$USER['id']."'")
OR (".$_SESSION['selected_menu_item_id']."  <b>is null</b>
AND tasks.author_id = '".$USER['id']."'")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы