关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
两年前关门了。
改进这个问题
给出3个表格(合同、服务、合同和服务)
一个包含4种类型的多个服务的合同(目前,还会有更多)。
我需要的是得到每个合同的所有价格的总和(),按服务类型分组,每个合同一行。
contracts.id、'total\ u service\ u type\ u 1'、'total\ u service\ u type\ u 2'、'total\ u service\ u type\ u 3'、'total\ u service\ u type\ u 4'
合同
身份证件
服务
身份证件
服务类型\u id
合同和服务
合同id
服务id
价格
这是我到目前为止得到的
SELECT c.id,s.servicetype_id,sum(cs.price)as total
FROM contracts c
LEFT JOIN addresses a ON a.id = c.address_id
LEFT JOIN contracts_services cs ON cs.contract_id = c.id
LEFT JOIN services s ON s.id = cs.service_id
WHERE s.servicetype_id IS NOT NULL
GROUP BY c.id,s.servicetype_id
ORDER BY c.id
如何将这些查询结果转换为单个合同行的列?
1条答案
按热度按时间ecfsfe2w1#
mysql中不能有动态列(据我所知,也不能有任何sql风格)。因此,您只能通过将每个服务类型添加为新的
join
你的问题。为了简洁起见,我在下面的示例中添加了两种服务类型,对于额外的服务类型,只需添加更多LEFT JOIN
.最后一句话:这是你的痛苦。这个解决方案绝对不灵活。对于添加的每种新服务类型,都必须再次编辑查询。你应该在你的编程语言中寻找解决方案。所以当你打电话的时候
MySQL
从PHP
,使用您已有的查询,并使用PHP
重写数组(动态)以获得所需的输出(替换PHP
使用的编程语言)。sqlfiddle:http://sqlfiddle.com/#!9/4f9a9c/2/0
注意:您可以更换
SUM(cs1.price)
与IFNULL(SUM(cs1.price), 0)
如果你愿意的话0
结束NULL
.edit:在阅读paulspiegel的评论(关于pivot表)之后,使用较少的连接,从而更有可能对数据库服务器友好。但是,与上述查询具有相同的缺点:每次添加新服务类型时都必须对其进行编辑。