SQL 一组中的 ID 和另一组中的 ID

SQL an ID in one group and an id from another

我有一个请求,我需要一个参与者在一个 ID(完成其他事情的网关)下完成 activity,然后是其他 ID 列表中的一个 ID 的计数。现在,此代码仅返回一个 ID 的计数,而不是说一个 ID 完整 + 其他 ID。

select
    plan,
    count(*)
from
    table
where
    id = 1234
    and
    id in (1354, 5842, 8565)
group by
    plan

我怎样才能得到这个,它给我来自 id 1234 的数据计数加上 (1354, 5842, 8565) 中的 id,而不仅仅是来自 id 1234 的数据计数

SELECT
  plan,
  count(*)
FROM
  table
WHERE
  id in (1234, 1354, 5842, 8565)
GROUP BY
  plan

这会为您提供 ID 1234 加上 (1354, 5842, 8565) 中的 ID 的数据计数。 正如其他用户提到的那样,提供更多信息将有助于获得更好的答案。就像当前的输出是什么以及期望的是什么。 此外,如果简单则没有必要,但具有 table 描述不会造成伤害(DESCRIBE table; 的输出)

谢谢

  • 看来您掉进了“SQL 看起来像 自然 英语查询”的陷阱。
    • 有趣的事实:它不是
    • 您可能听说过 COBOL:一种类似于英语的业务规则编程语言,但 COBOL 实际上具有严格、不灵活的语法和语义规则,背叛了看似友好的句法。
    • SQL 非常相似:在一个非常敌对的学术数学分支 Relational Calculus.
    • 上,它只是一层非常非常薄的平易近人的外表
    • 每次我不得不打出他们法令不必要的冗长和逻辑上不一致的SELECT e FROM a WHERE b GROUP BY c HAVING d ORDER BY f陈述时,我都会诅咒SQL语言大祭司。

无论如何!...

更改您的查询以删除 id = 1234,使其仅使用 id IN ( ... ) 子句:

select
    plan,
    count(*)
from
    table
where
    id in (1354, 5842, 8565)
group by
    plan

如果您想要一个更符合您描述的心智模型的查询,请使用 UNION [ALL] 查询:

SELECT
    plan,
    COUNT(*) AS "count"
FROM
    table
WHERE
    Id = 1354
GROUP BY
    plan

UNION

SELECT
    plan,
     COUNT(*) AS "count"
FROM
    table
WHERE
    Id in ( 5842, 8565 )
GROUP BY
    plan

解释:

  • SQL中的AND运算符表示一个Logical Conjunction:也就是左边和右边AND 运算符的必须是 true
    • 鉴于 Id 是您的主键(至少,我希望它是!)table 中的任何一行都不可能有一个 Id同时等于12345842。这就是为什么您的查询总共只匹配 1 行。
      • 此外,令人惊讶的是,SQL 引擎 不会警告您 谓词在逻辑上是不可能的,或者有多余的子表达式。
        • 我个人的看法是,如果一种计算机语言 允许 松散的语法,它应该在观察到 不正确的地方 时发出警告.这也是我不喜欢SQL.
        • 的另一个原因
  • x IN ( a, b, c ) 在语义上 ( x = a OR x = b OR x = c ) 相同
  • 我假设您认为 Id = 1234 AND Id IN ( a, b, c ) 使用“and”作为逻辑析取,而不是逻辑强制。因此,解决方法是用 OR.
  • 替换 AND