如何解决MYSQL:仅根据ID分组在第一行中添加一些数据
我有这组示例数据:
表invoice
:
--------------------------------------------------
| ID | date | invoice_number | total |
--------------------------------------------------
| 81 | 2017-03-24 | 0000000173 | 190.00 |
--------------------------------------------------
表invoice_addon
:
----------------------------------------------------------
| ID | invoice_id | description | amount |
----------------------------------------------------------
| 46 | 81 | Price Adjust. - Jumbo | -12.00 |
| 47 | 81 | Price Adjust. - Regular | -12.00 |
----------------------------------------------------------
表orders
:
----------------------------------------------------------------------------------
| ID | invoice_id | Box_name | size | price | tax | Box_number |
----------------------------------------------------------------------------------
| 177 | 81 | Jumbo Box | 23x25x17 | 97.00 | 15.00 | FCI107056 |
| 178 | 81 | Regular Box | 20x23x17 | 87.00 | 15.00 | FCI107057 |
----------------------------------------------------------------------------------
我想要实现的目标:
----------------------------------------------------------------------------------------------------------------------------------
| trans_date | inv_number | Box_name | size | gross | Box_number | others | description | net |
----------------------------------------------------------------------------------------------------------------------------------
| 2017-03-24 | 0000000173 | Jumbo Box | 23x25x17 | 112.00 | FCI107056 | -24.00 | Price Adjust. - Jumbo -12.00 | 88.00 |
| | | | | | | | Price Adjust. - Regular -12.00 | |
----------------------------------------------------------------------------------------------------------------------------------
| 2017-03-24 | 0000000173 | Regular Box | 20x23x17 | 102.00 | FCI107057 | 0 | NULL | 102.00|
----------------------------------------------------------------------------------------------------------------------------------
我当前的查询:
SELECT DATE(i.date) AS trans_date,i.invoice_number AS inv_number,o.Box_name as Box_name,o.size AS size,(SELECT Price + Tax FROM orders WHERE ID = o.ID) AS gross,o.Box_number AS Box_number,SUM(a.amount) AS others,(SELECT GROUP_CONCAT(CONCAT(description,' ',amount) SEParaTOR '<br />') FROM invoice_addon WHERE invoice_id = i.ID) AS description,(SUM(o.price + o.tax) + SUM(a.amount)) AS net
FROM `invoice` i
INNER JOIN orders o ON i.ID = o.invoice_id
LEFT JOIN invoice_addon a ON i.ID = a.invoice_id
WHERE i.ID = 81
GROUP BY o.ID
我的查询结果中的问题是others
和description
列已加倍。它只能显示在第一行。不管发票中捆绑了多少盒,都应仅在第一行中添加它们。网络也依赖于这些列。
我得到的是
----------------------------------------------------------------------------------------------------------------------------------
| trans_date | inv_number | Box_name | size | gross | Box_number | others | description | net |
----------------------------------------------------------------------------------------------------------------------------------
| 2017-03-24 | 0000000173 | Jumbo Box | 23x25x17 | 112.00 | FCI107056 | -24.00 | Price Adjust. - Jumbo -12.00 | 200.00 |
| | | | | | | | Price Adjust. - Regular -12.00 | |
----------------------------------------------------------------------------------------------------------------------------------
| 2017-03-24 | 0000000173 | Regular Box | 20x23x17 | 102.00 | FCI107057 | -24.00 | Price Adjust. - Jumbo -12.00 | 180.00 |
| | | | | | | | Price Adjust. - Regular -12.00 | |
----------------------------------------------------------------------------------------------------------------------------------
有可能吗?我该怎么做? (我正在使用CodeIgniter和DataTable在MysqL中进行此操作)
解决方法
好吧,您需要一些var
来存储当前行号并检查其是否等于1
。像这样:
SET @row_number = 0;
SELECT DATE(i.date) AS trans_date,i.invoice_number AS inv_number,o.box_name as box_name,o.size AS size,(SELECT Price + Tax FROM orders WHERE ID = o.ID) AS gross,o.box_number AS box_number,if((@row_number:=@row_number + 1)=1,SUM(a.amount),null) AS others,if(@row_number=1,(SELECT GROUP_CONCAT(CONCAT(description,' ',amount)
SEPARATOR '<br />') FROM invoice_addon WHERE invoice_id = i.ID),null) AS description,(SUM(o.price + o.tax) + SUM(a.amount)) AS net
FROM `invoice` i
INNER JOIN orders o ON i.ID = o.invoice_id
LEFT JOIN invoice_addon a ON i.ID = a.invoice_id
WHERE i.ID = 81
GROUP BY o.ID
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。