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
值同时等于1234
和5842
。这就是为什么您的查询总共只匹配 1 行。
- 此外,令人惊讶的是,SQL 引擎 不会警告您 谓词在逻辑上是不可能的,或者有多余的子表达式。
- 我个人的看法是,如果一种计算机语言 允许 松散的语法,它应该在观察到 不正确的地方 时发出警告.这也是我不喜欢SQL.
的另一个原因
x IN ( a, b, c )
在语义上 与 ( x = a OR x = b OR x = c )
相同。
OR
是逻辑析取,不是 英语的“或”:https://en.wikipedia.org/wiki/Logical_disjunction
- 这是 SQL 的“自然”英语 veneer 谬误中的另一个 gotcha。
- 我假设您认为
Id = 1234 AND Id IN ( a, b, c )
使用“and”作为逻辑析取,而不是逻辑强制。因此,解决方法是用 OR
. 替换 AND
我有一个请求,我需要一个参与者在一个 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
值同时等于1234
和5842
。这就是为什么您的查询总共只匹配 1 行。- 此外,令人惊讶的是,SQL 引擎 不会警告您 谓词在逻辑上是不可能的,或者有多余的子表达式。
- 我个人的看法是,如果一种计算机语言 允许 松散的语法,它应该在观察到 不正确的地方 时发出警告.这也是我不喜欢SQL. 的另一个原因
- 此外,令人惊讶的是,SQL 引擎 不会警告您 谓词在逻辑上是不可能的,或者有多余的子表达式。
- 鉴于
x IN ( a, b, c )
在语义上 与( x = a OR x = b OR x = c )
相同。OR
是逻辑析取,不是 英语的“或”:https://en.wikipedia.org/wiki/Logical_disjunction- 这是 SQL 的“自然”英语 veneer 谬误中的另一个 gotcha。
- 我假设您认为
Id = 1234 AND Id IN ( a, b, c )
使用“and”作为逻辑析取,而不是逻辑强制。因此,解决方法是用OR
. 替换
AND