返回 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.minutesOnlineUseage.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 子句未返回确切结果

oracle子查询中not in后面不能为null值的理解

只返回传递值的默认函数?

具有默认参数值的打字稿条件返回类型

ACCEss表中要设置默认值:DATE()结果是例:2011-8-29,我想要带时间的,例2011-8-29 5:45:12