我试图做一个基于特定标准的高级数字选择。我有一张画清单,每幅画上都有N种颜色。我只有几种特定的颜色。DB是超级容易的:一个绘画表(id-name),一个绘画表(id-name)和一个连接颜色和绘画的表(painting_id - colour_id)。
我的第一个问题是找到我能用我所拥有的颜色“画”的画。我使用这个查询(假设我有颜色4,5,6,7,8,9,10,11,12,13,14):
SELECT sub1.painting_id AS id FROM
(
SELECT painting_id, count(color_id) AS tot FROM painting_colors GROUP BY painting_id
) AS sub1,
(
SELECT painting_id, count(color_id) AS matched FROM painting_colors WHERE color_id IN(4,5,6,7,8,9,10,11,12,13,14) GROUP BY painting_id
) AS sub2
WHERE sub1.painting_id = sub2.painting_id AND (tot - matched) = 0
这很好用,但现在我想找出我应该“买”哪种颜色,这样我才能画出我没有它画不出的最大数量的画。
实现这一目标的一个错误方法是搜索我没有的最常用的颜色,使用以下查询:
SELECT color_id, count(*) FROM painting_colors WHERE color_id NOT IN(4,5,6,7,8,9,10,11,12,13,14) GROUP BY color_id ORDER BY count(*) DESC
但我知道这是错误的,因为它会告诉我最常用的颜色,而不是我需要完成绘画的颜色,那甚至可能是非常罕见的绘画。
我脑子里唯一想到的就是使用第一个查询每次添加一个不同的color_id来查看可以完成的绘画计数,最后我会排序这些计数,我会找到最想要的颜色,但我想这是非常糟糕的表现,我相信有一个更聪明的方法。
步骤1可以是找到每一幅画,并丢弃丢失的颜色1,就像第一个查询一样,但是像这样改变计数。
(tot - matched) = 1
在那之后,我迷失了
有什么建议吗?提前感谢!
发布于 2022-07-25 07:48:58
我找到了答案,也多亏了曾傑瑞
SELECT
color_id, COUNT(*) AS would_unlock_paintings
FROM painting_colors
WHERE painting_id IN
(
SELECT sub1.painting_id AS id FROM
(
SELECT painting_id, count(color_id) AS tot FROM painting_colors GROUP BY painting_id
) AS sub1,
(
SELECT painting_id, count(color_id) AS matched FROM painting_colors WHERE color_id IN(2,4,5,7,9,11,12,13,15,17,18) GROUP BY painting_id
) AS sub2
WHERE sub1.painting_id = sub2.painting_id AND tot - matched = 1
)
AND color_id NOT IN (2,4,5,7,9,11,12,13,15,17,18)
GROUP BY color_id
有了这些颜色: 2,4,5,7,9,11,12,13,15,17,18,我们发现添加color_id:1会“解锁”2幅画,而color_id:21会解锁一幅画
https://stackoverflow.com/questions/73102240
复制相似问题