返回 IN 值的默认结果,不管
Posted
技术标签:
【中文标题】返回 IN 值的默认结果,不管【英文标题】:Return default result for IN value regardless 【发布时间】:2017-11-23 07:17:22 【问题描述】:我有一个查询可以获取在特定日期范围内在线的所有用户。由于我想要显示数据的方式,这是通过 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 函数
【问题讨论】:
应该users.minutes
是OnlineUseage.minutes
?
IN子句中的值是从子选择中获取的?
这里没有 users 表。见meta.***.com/questions/333952/…
这能回答你的问题吗? Left Outer Join doesn't return all rows from my left table?
【参考方案1】:
你对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
【讨论】:
太棒了!不敢相信我没有考虑将条件移动到 JOIN 部分。谢谢。允许时将标记为正确。OnlineUseage.Date
上的条件如果在 from 子句上,则在连接之前应用
如果你想选择 users.Name 你需要将它添加到 group by (更好)。对于另一个数据库,这是强制性的。
@Indent 我的问题已被标记为与此问题重复 - ***.com/questions/50849705/…。你能帮忙吗?【参考方案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 值的默认结果,不管的主要内容,如果未能解决你的问题,请参考以下文章
具有 CSV 值的列上的 JPA 查询 IN 子句未返回确切结果
ACCEss表中要设置默认值:DATE()结果是例:2011-8-29,我想要带时间的,例2011-8-29 5:45:12