Devuelve el resultado predeterminado para el valor IN independientemente

Resuelto steve asked hace 7 años • 2 respuestas

Tengo una consulta que incluye a todos los usuarios que han estado en línea entre un determinado rango de fechas. Esto se hace mediante una consulta IN debido a cómo quiero mostrar los datos. Sin embargo, me gustaría devolver un valor predeterminado si no se encontraron registros para una ID analizada en la condición IN.

Consulta simplificada:

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,.........)

Ahora la consulta anterior solo incluirá aquellas filas que cumplan con la condición, como se esperaba. También me gustaría que la consulta obtenga un valor predeterminado para las ID dentro de la condición IN que no cumplen con la condición.

El uso IFNULLen este caso no funcionará ya que el registro nunca se devuelve

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,.........)

Para su información, estoy analizando esta consulta en una función PDO personalizada. No estoy usando funciones de MySQL en desuso

steve avatar Nov 23 '17 14:11 steve
Aceptado

Tiene una condición en OnlineUseagela unión izquierda que se vuelve como una unión interna.

mover su condición a la fromcláusula será mejor:

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
Indent avatar Nov 23 '2017 07:11 Indent