Как отредактировать этот запрос MySQL, чтобы он возвращал результат, когда условие выполнено или строка не найдена? - PullRequest
0 голосов
/ 07 марта 2019

У меня есть таблица data, и она выглядит следующим образом:

id ---- user ---- status
1 ----- abc ----- idle
2 ----- def ----- received

, что я использую следующее, чтобы получить результат

WHERE status ='idle' AND user='abc'

Выше моя попытка вернутьрезультат запроса, если status = idle' for abc`

Тем не менее, я действительно хочу получить результат для abc, даже если он не существует в таблице data, и я попытался это

 WHERE (status ='idle' or not exists(select * from data where user='2NnG1zvogogH' limit 1)  ) AND user='abc'

без удачи.

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 07 марта 2019
SELECT * FROM (    
    SELECT id, user, status FROM data WHERE status = 'idle'
    UNION
    SELECT * FROM (
        SELECT 0 id, IF((SELECT COUNT(id) FROM data WHERE user = 'abc') = 0, 'abc', NULL) user, 'status' status
    ) tmp
    WHERE user= 'abc'
) tmp2 ORDER BY id

SELECT id, user, status FROM data WHERE status = 'idle' вернет все результаты в таблице, которые соответствуют этому критерию.Это достаточно очевидно.

SELECT 0 id, IF((SELECT COUNT(id) FROM data WHERE user = 'abc') = 0, 'abc', NULL) user, 'status' status всегда будет возвращать одну строку.Единственная разница будет, если user = 'abc' или user = NULL.user вернет 'abc', если в базе данных нет user = 'abc'.

SELECT * FROM (...) tmp WHERE user= 'abc' просто фильтрует результаты из вышеприведенного запроса, так что если строка user = NULL, то она не включаетсяв остальных результатах.

Все это затем упорядочивается в самом внешнем запросе.

0 голосов
/ 07 марта 2019

Я думаю, что вам нужно:

WHERE (status = 'idle' and user = 'abc')
OR NOT EXISTS (SELECT * FROM data WHERE user = 'abc')

Нет необходимости в LIMIT 1, когда подзапрос используется с EXISTS, база данных знает, что он должен соответствовать только одной строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...