You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL进阶查询:找出可解锁最多画作的待购颜色

优化方案:找出能解锁最多画作的缺失颜色

核心思路

我们的目标是找到添加后能直接解锁最多当前无法绘制画作的颜色,这类颜色的核心作用是补全那些仅缺1种颜色的画作——因为只有这类画作,单买一种颜色就能立即变为可绘制状态。聚焦这类场景能大幅提升计算效率,避免暴力遍历的性能问题。

具体SQL实现

第一步:定位仅缺1色的画作及对应缺失颜色

我们用CTE分层处理数据,先筛选出已拥有的颜色,再统计每幅画的颜色匹配情况,最后锁定仅缺1色的画作及其缺失的颜色:

WITH owned_colors AS (
    SELECT id FROM colors WHERE id IN (4,5,6,7,8,9,10,11,12,13,14) -- 替换为你的拥有颜色ID集合
),
painting_color_stats AS (
    SELECT
        pc.painting_id,
        COUNT(pc.color_id) AS total_colors,
        COUNT(oc.id) AS matched_colors,
        COUNT(pc.color_id) - COUNT(oc.id) AS missing_count
    FROM painting_colors pc
    LEFT JOIN owned_colors oc ON pc.color_id = oc.id
    GROUP BY pc.painting_id
),
missing_single_color_paintings AS (
    SELECT
        pcs.painting_id,
        pc.color_id AS missing_color_id
    FROM painting_color_stats pcs
    JOIN painting_colors pc ON pcs.painting_id = pc.painting_id
    LEFT JOIN owned_colors oc ON pc.color_id = oc.id
    WHERE pcs.missing_count = 1 AND oc.id IS NULL
)

第二步:统计每种缺失颜色的解锁能力

基于上面的结果,直接统计每种缺失颜色能解锁的画作数量,并按数量降序排列:

SELECT
    c.name AS color_name,
    mscp.missing_color_id AS color_id,
    COUNT(mscp.painting_id) AS unlocked_paintings_count
FROM missing_single_color_paintings mscp
JOIN colors c ON mscp.missing_color_id = c.id
GROUP BY mscp.missing_color_id, c.name
ORDER BY unlocked_paintings_count DESC;

方案优势

  • 性能高效:无需重复执行原查询,一次计算即可得到结果,避免了暴力遍历所有缺失颜色的冗余操作
  • 精准匹配需求:只针对能直接解锁画作的场景,避免了单纯统计颜色使用次数的偏差
  • 逻辑清晰:CTE分层设计让查询逻辑一目了然,也便于数据库优化执行计划

可选扩展:评估颜色的潜在价值

如果需要考虑那些缺多种颜色的画作(添加颜色后虽不能直接解锁,但能减少后续解锁所需的颜色数量),可以用以下查询统计每种缺失颜色在无法绘制画作中的出现频率:

WITH owned_colors AS (
    SELECT id FROM colors WHERE id IN (4,5,6,7,8,9,10,11,12,13,14)
),
painting_missing_colors AS (
    SELECT
        pc.painting_id,
        pc.color_id AS missing_color_id
    FROM painting_colors pc
    LEFT JOIN owned_colors oc ON pc.color_id = oc.id
    WHERE oc.id IS NULL
)
SELECT
    c.name AS color_name,
    pmc.missing_color_id AS color_id,
    COUNT(pmc.painting_id) AS helps_unlock_count
FROM painting_missing_colors pmc
JOIN colors c ON pmc.missing_color_id = c.id
GROUP BY pmc.missing_color_id, c.name
ORDER BY helps_unlock_count DESC;

这个结果能帮你评估颜色的长期价值,但注意它和直接解锁的画作数量是两个不同的指标。

内容的提问来源于stack exchange,提问作者Federico Fallico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:36:27