问题描述
我有两个主表,其中包含活动预订。 注册人表(预订)R 和事件表 E。
还有两个连接的表,Field_Values V 和 Event_Categories C
此图显示了关系
我想要做的是创建一个反映用户购物车的发票查询。通常,用户会在一次交易中预订多个事件,因此我的发票应该包含常见项目的列,例如用户名、用户电子邮件、预订日期、交易 ID 和发票行项目值的汇总列,例如数量 "1,2" 描述 "Desc1,Desc2" 价格 "10.00,20.00" 购物车中有两个订单项。
交易 ID (dcea4_eb_registrant.transaction_id) 在每个发票中是唯一的,并且在该销售中的每个订单项重复。
SELECT
R.id as ID,E.event_date as ServiceDate,E.event_date - INTERVAL 1 DAY as DueDate,Concat('Ad-Hoc Booking:',E.title) as ItemProductService,Concat(R.first_name,' ',R.last_name) as Customer,R.first_name as FirstName,R.last_name as LastName,R.email,R.register_date as InvoiceDate,R.amount as ItemAmount,R.comment,R.number_registrants as ItemQuantity,R.transaction_id as InvoiceNo,R.published as Status,E.event_date AS SERVICEDATE,E.title) AS DESCRIPTION,R.number_registrants AS QUANTITY,FORMAT(R.amount / R.number_registrants,2) AS RATE,R.amount AS AMOUNT,C.category_id as CLASS,Concat(Group_Concat(V.field_value SEParaTOR ','),'. ',R.comment) as Memo
FROM dcea4_eb_events E
LEFT JOIN dcea4_eb_registrants R ON R.event_id = E.id
LEFT JOIN dcea4_eb_field_values V ON V.registrant_id = R.id
LEFT JOIN dcea4_eb_event_categories C ON C.event_id = R.event_id
WHERE 1=1
AND V.field_id IN(14,26,27,15)
AND R.published <> 2 /*Including this line omits Cancelled Invoices */
AND R.published IS NOT NULL
AND (R.published = 1 OR R.payment_method = "os_offline")
AND (R.register_date >= CURDATE() - INTERVAL 14 DAY)
GROUP BY E.event_date,E.title,R.id,R.first_name,R.last_name,R.register_date,R.amount,R.comment
ORDER BY R.register_date DESC,R.transaction_id
这会产生这样的输出
我正在使用以下查询尝试将具有公共事务 ID 的行(最后一张图片中的第 2 行和第 3 行)组合在一起 - 我在要聚合的列上添加 group_concat,并将 Group By 更改为交易 ID
SELECT
R.id as ID,Group_ConCat( E.event_date) AS SERVICEDATE,Group_ConCat( Concat('Ad-Hoc Booking:',E.title)) AS DESCRIPTION,Group_ConCat( R.number_registrants) AS QUANTITY,Group_ConCat( FORMAT(R.amount / R.number_registrants,2)) AS RATE2,Group_ConCat( R.amount) AS AMOUNT,Group_ConCat( C.category_id) as CLASS,15)
AND R.published <> 2 /*Including this line omits Cancelled Invoices */
AND R.published IS NOT NULL
AND (R.published = 1 OR R.payment_method = "os_offline")
AND (R.register_date >= CURDATE() - INTERVAL 14 DAY)
GROUP BY R.transaction_id
ORDER BY R.register_date DESC,R.transaction_id
但这会产生这个输出
它似乎在增加行数。第一行的 Quantity 列应该是 1 ,第二行应该是 2,1 。
我尝试将 Group_Concat 与 disTINCT 一起使用,但这不起作用,因为通常连接的值是相同的(例如,预订的两个事件的价格都相同)并且查询仅返回一个值,例如10 而不是 10、10。后者正是我所需要的。
我猜问题在于表格的连接方式,但我正在努力弄清楚如何获得我需要的东西。
最赞赏正确方向的指针。
解决方法
你似乎决心朝我看来是错误的方向前进,所以轻轻推下那座山......
考虑以下...
CREATE TABLE users
(user_id SERIAL PRIMARY KEY,username VARCHAR(12) UNIQUE
);
INSERT INTO users VALUES
(101,'John'),(102,'Paul'),(103,'George'),(104,'Ringo');
DROP TABLE IF EXISTS sales;
CREATE TABLE sales
(sale_id SERIAL PRIMARY KEY,purchaser_id INT NOT NULL,item_code CHAR(1) NOT NULL,quantity INT NOT NULL
);
INSERT INTO sales VALUES
( 1,101,'A',1),( 2,103,2),( 3,3),( 4,104,( 5,( 6,( 7,'B',( 8,( 9,(10,(11,(12,1);
SELECT u.*,x.sale_ids,x.item_codes,x.quantities
FROM users u
LEFT
JOIN
( SELECT purchaser_id,GROUP_CONCAT(sale_id ORDER BY sale_id) sale_ids,GROUP_CONCAT(item_code ORDER BY sale_id) item_codes,GROUP_CONCAT(quantity ORDER BY sale_id) quantities
FROM sales
GROUP
BY purchaser_id
) x
ON x.purchaser_id = u.user_id;
+---------+----------+---------------+-------------+-------------+
| user_id | username | sale_ids | item_codes | quantities |
+---------+----------+---------------+-------------+-------------+
| 101 | John | 1 | A | 1 |
| 102 | Paul | NULL | NULL | NULL |
| 103 | George | 2,3,7,8,10 | A,A,B,B | 2,2,2 |
| 104 | Ringo | 4,5,6,9,11,12 | A,B | 1,1 |
+---------+----------+---------------+-------------+-------------+