Mysql 分组中部分(非聚合列)的备选方案[黑客银行上奥利凡德的库存问题]

Mysql 分组中部分(非聚合列)的备选方案[黑客银行上奥利凡德的库存问题],mysql,group-by,Mysql,Group By,我正在努力解决这个问题 通过正确的mysql设置,您可以执行以下操作 select w.id, wp.age, min(w.coins_needed), w.power from wands w join wands_property wp on wp.code = w.code and wp.is_evil=0 group by w.code order by w.power desc, wp.age desc; 但是hackerrank的mysql设置不允许部分分组。它抛出错误 SELEC

我正在努力解决这个问题

通过正确的mysql设置,您可以执行以下操作

select w.id, wp.age, min(w.coins_needed), w.power from wands w
join wands_property wp
on wp.code = w.code and wp.is_evil=0
group by w.code
order by w.power desc, wp.age desc;
但是hackerrank的mysql设置不允许部分分组。它抛出错误

SELECT列表不在GROUP BY子句中,并且包含未聚合的 列“run_eootvjd0lna.w.id”,它在功能上不依赖于 按子句分组的列;这是不符合的 sql\u模式=仅\u完整\u组\u由

因此,我想首先过滤掉wands表中给定代码的所有重复项,只留下最少需要的行。这样,我就可以在提取的表上加入wands_属性

希望获得仅提取所需行的相关最小硬币的建议,以便进一步使用


PS:我用示例数据创建了一个SQLFIDLE

我不确定是否正确

但是

select w.id, w.code, w2.coins_needed, w.power
, wp.age 
from wands w
inner join (SELECT code, Min(coins_needed) coins_needed From Wands Group by code)  w2 
on w.code = w2.code and w.coins_needed = w2.coins_needed
join wands_property wp
on wp.code = w.code and wp.is_evil=0
你得到

id  code    coins_needed    power   age
1   10      100             2       100
3   20      300             3       200
8   40      300             4       400
这是所有魔杖的结果,对于没有分组的代码来说,成本最低。

以下是我在步骤3中对最终解决方案的解释:

步骤1:

根据电源和代码过滤需要最少硬币的行。 为什么代码和权力因为需求需要我们根据年龄过滤,而权力和年龄与代码有1-1的关系,所以代码和权力是过滤的逻辑场所

select w2.code, w2.power, min(w2.coins_needed) coins
from wands w2
group by w2.code, w2.power
步骤2:

此表仅用于筛选行,以获取wands表的所有列

select w.id, wp.age, w.code, min(w.coins_needed), w.power  from wands w
join (
        select w2.code, w2.power, min(w2.coins_needed) coins from wands w2
        group by w2.code, w2.power
      ) wcp
on wcp.code = w.code and wcp.power = w.power and wcp.coins = w.coins_needed
步骤3:

最后一步是将wands_属性与我们在步骤2中得到的新表连接起来,并根据问题的需要进行排序

select w.id, wp.age, w.code, min(w.coins_needed), w.power  from wands w
join (
        select w2.code, w2.power, min(w2.coins_needed) coins from wands w2
        group by w2.code, w2.power
      ) wcp
on wcp.code = w.code and wcp.power = w.power and wcp.coins = w.coins_needed
join wands_property wp
on wp.code = w.code and wp.is_evil=0
order by w.power desc, wp.age desc ;

@katch我认为在第一个SELECT语句中,您不需要在所需的硬币上使用min,因为min已经应用于子查询中,以过滤相同代码和电源所需的最小硬币,我执行了这段代码,它被认为是正确的答案 选择w.id,p.age,w.coins_needed,w.'power`来自魔杖w内部连接选择w1.code,w1.power,minw1.coins_需要作为魔杖w1组的硬币按代码,power作为w.code=w2.code上的w2,w.coins_needed=w2.coins,w.'power`=w2.'power`内部连接魔杖属性p ON w.code=p.code,其中p.is_邪恶=0由w.'power'DESC,p.age描述