Возвращать результат по умолчанию для значения IN независимо

У меня есть запрос, который получает всех пользователей, которые были в сети между определенным диапазоном дат. Это делается с помощью запроса IN из-за того, как я хочу отображать данные. Тем не менее, я хотел бы вернуть значение по умолчанию, если не было найдено записей для идентификатора, который был разобран в состоянии IN.

Упрощенный запрос:

SELECT users.Name, users.ID, SUM(users.Minutes) AS MinutesOnline FROM UserTable LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID WHERE OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59' AND UserTable.ID IN(332,554,5764,11,556,.........) GROUP BY users.ID ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........) 

Теперь вышеуказанный запрос будет тянуть только те строки, которые удовлетворяют условию, как и ожидалось. Я также хотел бы, чтобы запрос вытащил значение по умолчанию для идентификаторов в состоянии IN, которое не соответствует этому условию.

Использование IFNULL в этом случае не будет работать, поскольку запись никогда не возвращается

 SELECT users.Name, users.ID, IFNULL(SUM(users.Minutes), 0) AS MinutesOnline FROM UserTable LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID WHERE OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59' AND UserTable.ID IN(332,554,5764,11,556,.........) GROUP BY users.ID ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........) 

FYI – я разбираю этот запрос в пользовательской функции PDO. Я не использую устаревшие функции mysql

У вас есть условие для OnlineUseage левое соединение становится как внутреннее соединение.

переместить ваше условие в предложение from будет лучше:

 SELECT users.Name, users.ID, IFNULL(SUM(users.Minutes), 0) AS MinutesOnline FROM users LEFT JOIN OnlineUseage ON OnlineUseage.ID = users.ID and OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59' WHERE users.ID IN (332,554,5764,11,556,.........) GROUP BY users.ID,users.Name ORDER BY users.ID 

Когда вы используете LEFT JOIN вы должны поместить условия на вторую таблицу в предложение ON . Помещение их в WHERE фильтрует все строки, которые не имеют совпадений, потому что эти столбцы будут NULL и условия никогда не будут успешными.

 SELECT users.Name, users.ID, IFNULL(SUM(OnlineUseage.Minutes), 0) AS MinutesOnline FROM UserTable LEFT JOIN OnlineUseage ON OnlineUseage.ID = UserTable.ID AND OnlineUseage.Date >= '2016-01-01 00:00:00' AND OnlineUseage.Date <= '2016-12-31 23:59:59' WHERE UserTable.ID IN(332,554,5764,11,556,.........) GROUP BY UserTable.ID ORDER BY FIELD(UserTable.ID, 332,554,5764,11,556,.........) 
  • Каковы плюсы и минусы выполнения вычислений в sql в вашем приложении
  • Справочный псевдоним в предложении WHERE
  • Внешнее соединение с объединением в Excel 2010 с использованием Power Query
  • Ограничить подключение SQL Server к определенному IP-адресу
  • Ошибка удаления базы данных (не может rmdir '.test \', errno: 17)
  • oracle вставить, если строка не существует
  • Как конкатенировать текст из нескольких строк в одну текстовую строку на SQL-сервере?
  • Как написать запрос в Microsoft SQL Server Management Studio, а затем использовать этот запрос в Excel
  • В Oracle можно ли вставить или ОБНОВИТЬ запись через представление?
  • Инструкция INSERT противоречит ограничению FOREIGN KEY - SQL Server
  • Создайте дату с дневного месяца и года с помощью T-SQL
  • Давайте будем гением компьютера.