mysql 两个分组合并_优雅的mysql从一个表中选择,分组和合并多行

这是我的桌子的简化版:

group price spec

a 1 .

a 2 ..

b 1 ...

b 2

c .

. .

. .

我想产生这样的结果:(我将其称为result_table)

price_a |spec_a |price_b |spec_b |price_c ...|total_cost

1 |. |1 |.. |... |

(min) (min) =1+1+...

基本上我想:

>选择每个组中包含最低价格的行

>将列合并为一行

我知道可以通过使用几个查询和/或对结果进行一些非sql处理来完成此操作,但是我怀疑可能会有更好的解决方案.

我要执行任务2的原因(将列合并为一行)

是因为我要对result_table执行以下操作:

select *,

(result_table.total_cost + table1.price + table.2.price) as total_combined_cost

from result_table

right join table1

right join table2

这可能要问的太多了,因此这是关于此问题的其他一些想法:

与其尝试合并多行(任务2),不如将它们存储在临时表中

(使用sum来计算total_cost会更容易)

随意发表想法,不必提供完整的答案,如果您有完成任务1的优雅方法,我觉得这足够聪明!

==编辑/新增2012年2月6日==

我的程序的目标是以最小的成本(最好同时具有更高的功利价值)确定物品的最佳组合.

考虑@ypercube关于大量组的评论,临时表似乎是唯一可行的解​​决方案.并且还指出,MySQL中没有枢纽功能(尽管it can be implemented,没有必要执行此类操作).

好吧,在研究了@Johan的答案之后,我正在为任务1考虑类似的事情:

select * from

(

select * from

result_table

order by price asc

) as ordered_table

group by group

;

虽然看起来有些狡猾,但似乎可行.

==编辑/新增2012年2月7日==

由于可能会有多个组合产生相同的最小值,所以我修改了答案:

select result_table.* from

(

select * from

(

select * from

result_table

order by price asc

) as ordered_table

group by group

) as single_min_table

inner join result_table

on result_table.group = single_min_table.group

and result_table.price = single_min_table.price

;

但是,我刚刚意识到,还有一个我需要处理的问题:

我不能忽略所有规范,因为有提供者属性,所以来自不同提供者的项目可能会或可能无法组装在一起,因此为了安全(并简化我的问题),我决定合并来自同一提供者的项目仅,因此问题变为:

例如,如果我有一个像这样的初始表(只有2个组和2个提供程序):

id group price spec provider

1 a 1 . x

2 a 2 .. y

3 a 3 ... y

4 b 1 ... y

5 b 2 x

6 b 3 z

我需要结合

id group price spec provider

1 a 1 . x

5 b 2 x

2 a 2 .. y

4 b 1 ... y

记录(id 6)不能包含所有可用组,因此可以从选择中删除.

因此,不一定要只选择每个组的最小值,而是要从每个组中选择一个,这样对于每个提供商,我的总成本就最小.

解决方法:

仅产生total_cost:

SELECT SUM(min_price) AS total_cost

FROM

( SELECT MIN(price) AS min_price

FROM TableX

GROUP BY `group`

) AS grp

如果在每个组的行(而不是在列)中返回的最低价格的结果集很好,那么您的问题就是每组最大的n.有多种解决方法.这是一个:

SELECT tg.grp

tm.price AS min_price

tm.spec

FROM

( SELECT DISTINCT `group` AS grp

FROM TableX

) AS tg

JOIN

TableX AS tm

ON

tm.PK = --- the Primary Key of the table

( SELECT tmin.PK

FROM TableX AS tmin

WHERE tmin.`group` = tg.grp

ORDER BY tmin.price ASC

LIMIT 1

)

标签:sql,mysql

来源: https://codeday.me/bug/20191201/2083313.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值