这是我的桌子的简化版:
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