mysql - 無論如何返回IN值的默認結果




(2)

我有一個查詢,可以獲取在特定日期範圍之間在線的所有用戶。 由於我想要顯示數據,這是通過IN查詢完成的。 但是,如果沒有找到已解析為IN條件的ID的記錄,我想返回默認值。

簡化查詢:

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條件中為不符合條件的ID提取默認值。

在此實例中使用 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,.........)

僅供參考 - 我正在將此查詢解析為自定義PDO函數。 我沒有使用棄用的mysql函數


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

您在 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






sql