这里有点复杂。我一直在寻找一种将结果用作列名的方法,虽然这似乎可行,但我发现的所有示例都使用了非常简单的表格设计。
我得到的是 3 个表。
我们有一个“order”表,然后可以有“order_extras”。 “extras”表存储额外商品的名称和价格,而“order_extras”基本上包含一个主键、订单 ID 和额外 ID。
粗略的图形表示如下:
以此为例,假设“extras”表中填充了 3 个额外的项目,在此阶段名称和价格无关紧要。
我想要做的是获取所有订单,但为每个额外项目的名称添加额外的列。如果商品已被购买(也就是在 order_extras 表中链接),它将显示价格,否则它将为空/空。
这可能吗?我一直在研究数据透视表,但关于这类事情的信息似乎有点不稳定。任何信息或建议将不胜感激!
示例数据
额外内容:
+----+------------------+--------+
| id | name | price |
+----+------------------+--------+
| 1 | Insurance | 59.95 |
| 2 | Lifetime Updates | 79.95 |
| 3 | Phone Support | 124.95 |
+----+------------------+--------+
订单:
+----+------------+
| id | customer |
+----+------------+
| 1 | John Smith |
| 2 | Bob Newbie |
| 3 | Bill Jobs |
| 4 | Ray Stantz |
+----+------------+
order_extras:
+----+----------+----------+
| id | order_id | extra_id |
+----+----------+----------+
| 1 | 4 | 2 |
| 2 | 3 | 1 |
| 3 | 3 | 3 |
| 4 | 1 | 1 |
+----+----------+----------+
期望的输出:
+----------+----------------+-----------+------------------+---------------+
| order.id | order.customer | Insurance | Lifetime Updates | Phone Support |
+----------+----------------+-----------+------------------+---------------+
| 1 | John Smith | 59.95 | 0 | 0 |
| 2 | Bob Newbie | 0 | 0 | 0 |
| 3 | Bill Jobs | 59.95 | 0 | 124.95 |
| 4 | Ray Stantz | 0 | 79.95 | 0 |
+----------+----------------+-----------+------------------+---------------+
最佳答案
不幸的是,MySQL 没有pivot 函数,但可以使用带有CASE 表达式的聚合函数来复制。
如果您有已知数量的 extras,那么您可以对查询进行硬编码:
select o.id,
o.customer,
max(case when e.name = 'Insurance' then e.price else 0 end) Insurance,
max(case when e.name = 'Lifetime Updates' then e.price else 0 end) `Lifetime Updates`,
max(case when e.name = 'Phone Support' then e.price else 0 end) `Phone Support`
from orders o
left join order_extras oe
on o.id = oe.order_id
left join extras e
on oe.extra_id = e.id
group by o.id, o.customer
参见 SQL Fiddle with Demo .
对于您的情况,您似乎会有未知数量的值。如果是这样,那么你将需要使用准备好的语句来生成动态 sql:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN e.name = ''',
name,
''' THEN e.price else 0 END) AS `',
name, '`'
)
) INTO @sql
FROM extras;
SET @sql
= CONCAT('SELECT o.id,
o.customer, ', @sql, '
from orders o
left join order_extras oe
on o.id = oe.order_id
left join extras e
on oe.extra_id = e.id
group by o.id, o.customer');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
参见 SQL Fiddle with Demo .
这两个版本都会给出结果:
| ID | CUSTOMER | INSURANCE | LIFETIME UPDATES | PHONE SUPPORT |
------------------------------------------------------------------
| 1 | John Smith | 59.95 | 0 | 0 |
| 2 | Bob Newbie | 0 | 0 | 0 |
| 3 | Bill Jobs | 59.95 | 0 | 124.95 |
| 4 | Ray Stantz | 0 | 79.95 | 0 |
关于MySQL 列名作为与联结表的多对多关系的字段名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15558209/
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
我知道我可以指定某些字段来使用pluck查询数据库。ids=Item.where('due_at但是我想知道,是否有一种方法可以指定我想避免从数据库查询的某些字段。某种反拔?posts=Post.where(published:true).do_not_lookup(:enormous_field) 最佳答案 Model#attribute_names应该返回列/属性数组。您可以排除其中一些并传递给pluck或select方法。像这样:posts=Post.where(published:true).select(Post.attr
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve
我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod