【问题标题】:sql query to find unique combination of column datasql查询查找列数据的唯一组合
【发布时间】:2014-01-17 01:31:11
【问题描述】:

我正在尝试编写 sql 查询,该查询将从表中选择不同的列组合。

示例表数据:

+--+---+---+---+
|id|fk1|fk2|fk3|
+--+---+---+---+
|1 |1  |2  |3  |
+--+---+---+---+
|2 |1  |3  |3  |
+--+---+---+---+
|3 |2  |2  |3  |
+--+---+---+---+
|4 |2  |4  |3  |
+--+---+---+---+
|5 |3  |2  |3  |
+--+---+---+---+
|6 |3  |3  |3  |
+--+---+---+---+
|7 |3  |4  |3  |
+--+---+---+---+

在这里我需要编写一个返回 fk1 => 2 的查询,因为它具有 fk2 => 2 and 4 的唯一组合

如果问题不清楚,请告诉我。

谢谢

【问题讨论】:

  • 为什么“2”是唯一的组合,而不是“1”?两者都与“3”完全相交。
  • 因为我正在寻找 fk2 => 2 和 4 组合的行
  • 您正在寻找 fk2 => 2 或 fk2 => 4 的行?还是您的意思是您需要 fk2 = 2 和 fk2 = 4 的所有行?
  • @SharikovVladislav fk2 => 2 和 4 是查询的输入。并且输出应该是 fk1 => 2

标签: mysql sql


【解决方案1】:

我明白了。值“2”和“4”是查询的输入,而您正是需要这种组合。这是一个 set-within-sets 查询,我认为使用 having 子句进行聚合是最灵活的方法。

select fk1
from table t
group by fk1
having sum(fk2 = 2) > 0 and
       sum(fk2 = 4) > 0 and
       sum(fk2 not in (2, 4)) = 0;

即键fk1的值为2(至少一次),值为4,没有其他值。

【讨论】:

  • 嗨@Gordon,你的假设是正确的。但我只是试了一下,对我来说它什么也没返回。此外,对查询功能的解释将在未来有所帮助。谢谢。
  • 这是一个 SQL Fiddle,它证明了它的工作原理 (sqlfiddle.com/#!2/90ace/1)。
  • 谢谢。它确实有效。我对引号有一些疑问。
  • @Subash 。 . .这是 MySQL 语法,用于计算 fk2 值为 2 的行数。
  • 计算值不是 2 或 4 的行数。只有 fk1 没有此类行的值通过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
相关资源
最近更新 更多