gpt4 book ai didi

sql - postgreSQL 组合

转载 作者:行者123 更新时间:2023-11-29 12:20:37 25 4
gpt4 key购买 nike

我试图弄清楚如何为以下情况找到所有可能的组合(使用 SQL):

  • 我的碗里有 100 个乒乓球 (id = 1...100)
  • 每个球都是 4 种颜色之一(颜色 = 红色、绿色、蓝色、黄色)

我想按如下方式挑选 5 个球(无需更换)。

  • 1个红球
  • 2个绿球
  • 3个蓝球
  • 2个黄球
  • 1 个绿色、蓝色或黄色的球

如何使用 SQL 尽可能高效地确定所有可能的组合?

以下是我能想到的最好的,但我不希望顺序(组合)很重要,我也不想替换:

SELECT pick1.id, pick2.id, pick3.id, pick4.id, pick5.id, pick6.id, pick7.id, pick8.id, pick9.id
FROM bowl AS pick1, bowl AS pick2, bowl AS pick3, bowl AS pick4, bowl AS pick5, bowl AS pick6,
bowl AS pick7, bowl AS pick8, bowl AS pick9
WHERE
pick1.color = "red" AND
pick2.color = "green" AND
pick3.color = "green" AND
pick4.color = "blue" AND
pick5.color = "blue" AND
pick6.color = "blue" AND
pick7.color = "yellow" AND
pick8.color = "yellow" AND
(pick9.color = "green" OR
pick9.color = "blue" OR
pick9.color = "yellow")

最佳答案

我还没有在实际的 postgresql 服务器中尝试过,但这是一个想法。

首先,我会将颜色编码为整数:

  • 0 = 红色
  • 1 = 绿色
  • 2 = 蓝色
  • 3 = 黄色

现在,例如,我想画 3 个球:1 个红色、1 个绿色和 1 个绿色或黄色。对应的颜色代码,经过排序后,会在最终SQL语句的where子句中作为过滤器:

[0, 1, 1]
[0, 1, 3]

然后 not in (...) 基本上确保没有重复的 id,并且排序的颜色数组仅限于我们上面指定的集合。

CREATE EXTENSION intarray;

select p1.id, p2.id, p3.id
from bowl as p1
cross join bowl as p2
cross join bowl as p3
where
p2.id not in (p1.id)
and p3.id not in (p1.id, p2.id)
and sort(int[p1.color, p2.color, p3.color]) in (
int[0,1,1],
int[0,1,3]
)

sort() 函数需要 intarray 扩展。

只要您在 IN (. .) 谓词。参见 link .

关于sql - postgreSQL 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26869538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com