这是我的表格的简化版本:
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 日编辑/添加==
我的计划的目标是以最小的成本确定项目的最佳组合(最好同时具有更高的实用值(value))。
考虑@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
;
然而,我刚刚意识到还有一个问题需要处理:
我不能忽略所有规范,因为有一个 provider 属性,来自不同提供商的项目可能会或可能不会组装在一起,所以为了安全(并简化我的问题)我决定仅组合来自同一提供商的项目,因此问题变为:
例如,如果我有一个这样的初始表(只有 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) 可以从选择中删除,因为它没有所有可用的组。
因此,不一定只选择每个组中的最小值,而是从每个组中选择一个,以便每个提供商的综合成本最小。
最佳答案
您不能在 MySQL 中进行数据透视,但可以将结果分组在一起。
GROUP_CONCAT 函数将为您提供如下结果:
column A column B column c column d
groups specs prices sum(price)
a,b,c some,list,xyz 1,5,7 13
这是一个示例查询:
(该查询假定您在目标表上定义了一个名为 id 的主键(或唯一键)。
SELECT
GROUP_CONCAT(a.`group`) as groups
,GROUP_CONCAT(a.spec) as specs
,GROUP_CONCAT(a.min_price) as prices
,SUM(a.min_prices) as total_of_min_prices
FROM
( SELECT price, spec, `group` FROM table1
WHERE id IN
(SELECT MIN(id) as id FROM table1 GROUP BY `group` HAVING price = MIN(price))
) AS a
参见:http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html
关于mysql - 优雅的 mysql 从一个表中选择、分组、组合多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9157208/
在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?
这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式rubyshell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的rubyyaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir