Ошибка возврата запроса SELECT при пустом результате

0

Я использую SELECT запрос в качестве подзапроса в Query, приведенном ниже...

SELECT COUNT ('Notification'.'id') AS 'count'
FROM 'listaren_mercury_live'.'notifications' AS 'Notification'
WHERE NOT FIND_IN_SET('Notification'.'id',(SELECT read_ids FROM read_notifications WHERE user_id = 46))
AND((notisfication_for IN("all","India"))
OR(FIND_IN_SET(46,notification_for))

Этот запрос отлично работает, когда

SELECT read_ids FROM read_notifications WHERE user_id = userid)

результат возврата, равный 21,22,23,24

но когда этот запрос возвращает пустой.

Результат id 0 вместо 3. Есть 3 непрочитанных уведомления для пользователя; поэтому результат должен быть 3

проблема

Запрос дает правильный результат при возврате запроса внутреннего выбора

12,42 

но если запрос возвращает null, то весь результат запроса будет равен 0.

Ожидаемый результат с запросом

Изображение 174551

Результат Я получаю

Изображение 174551

Я просто хочу, если подзапрос возвращает пустое значение. Затем запрос (Notification.id, (SELECT read_ids FROM read_notifications WHERE user_id) = 46) выглядит так:

 ('Notification'.'id',(0))

вместо

('Notification'.'id',())

Так он будет работать должным образом

Скажите, пожалуйста, какое улучшение мне нужно в этом.

Спасибо

  • 2
    Вам действительно нужно показать нам образцы данных из ваших таблиц. Как общий комментарий, вы не должны хранить данные CSV в своей таблице. Таким образом, реальная проблема заключается в том, что, правильно или неправильно, ваш дизайн данных неправильный.
  • 2
    Исправьте вашу модель данных. Хранить списки чисел в виде строки, разделенной запятыми, просто неправильно в базе данных SQL.
Показать ещё 3 комментария
Теги:

1 ответ

1
Лучший ответ

Попробуйте заменить

FIND_IN_SET('Notification'.'id',(SELECT read_ids FROM read_notifications WHERE user_id = 46))

с

FIND_IN_SET('Notification'.'id',IFNULL((SELECT read_ids FROM read_notifications WHERE user_id = 46), ''))

Из руководства, если результат подзапроса пуст, он вернет NULL, а FIND_IN_SET вернет NULL, если любой аргумент равен NULL, а NOT NULL по-прежнему NULL, как и NULL AND 1, а NULL эквивалентен false. Поэтому, когда подзапрос возвращает NULL, ваше условие WHERE не будет выполнено.

Добавив IFNULL в результат подзапроса, вы можете получить его, чтобы вернуть значение, которое действительно для FIND_IN_SET, что позволит вашему запросу работать должным образом.

  • 0
    Хорошо ... Это работает .... Спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню