mysql - 無論如何返回IN值的默認結果
(2)
使用
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,.........)
我有一個查詢,可以獲取在特定日期範圍之間在線的所有用戶。 由於我想要顯示數據,這是通過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函數
您在
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