【问题标题】:Lowest unused ID from two combined tables两个组合表中的最低未使用 ID
【发布时间】:2021-09-24 10:13:54
【问题描述】:

我正在尝试编写 SQL 查询,以从存在于两个单独表中的名为 internal 的列中找到最低的可用/未使用 ID:

  1. 机器
  2. ma​​chines_ignore

数据是从外部源处理的,我们希望从machines_ignore 表中的所有机器获取数据。忽略表只是我们在识别不想分析的机器时手动设置的表。

我发现了在单个表上工作的脚本(比如只有 ma​​chines 表),但是当我尝试在组合两个表时让它工作时。

示例

表 1(机器)

id internal
1 1
2 2
3 3
4 5
5 6

表2(machines_ignore)

internal
4
7
8
9
12

预期结果

根据上面的例子,这个查询应该输出 10、11、13 等等。

有什么想法吗?

【问题讨论】:

  • 发布样本数据和预期结果。
  • 谢谢@SalmanA - 我已经做到了。
  • 您是否正在使用 mySQL 8 或更高版本?
  • stackoverflow.com/a/25719885/12181863 试试看这个答案?

标签: mysql sql


【解决方案1】:

一种解决方案是合并两个表中的值,然后使用EXISTS 检查每个值是否在两个表中都有下一个值:

SELECT x.internal + 1
FROM (
    SELECT internal FROM machines
    UNION
    SELECT internal FROM machines_ignore
) AS x
WHERE NOT EXISTS (
    SELECT 1 FROM machines WHERE internal = x.internal + 1
) AND NOT EXISTS (
    SELECT 1 FROM machines_ignore WHERE internal = x.internal + 1
)
LIMIT 1

【讨论】:

  • 谢谢!这给了我一个 NULL 结果,这是有可能的(有内部设置为 NULL 的机器)。需要如何更改查询才能忽略 NULL?
  • 内部不为空的地方?
  • 是的,我的问题是放在哪里。在联合子查询中工作正常 :) 谢谢!
  • 如果两个表都缺少 1 或 0,它会如何工作?如果它基于没有“下一个”值的值进行检索?
  • @yhstan 添加一个简单的union select 0 应该可以解决它
猜你喜欢
  • 2011-03-27
  • 2016-03-11
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
相关资源
最近更新 更多