将多个表中的不同记录作为一个事务历史记录列表

时间:2014-12-14 02:30:13

标签: mysql history multiple-tables

我正在制定员工管理/奖励系统,并且需要能够显示单一的交易历史记录"页面按时间顺序显示员工在一个列表中遇到的不同事件。 (有点像在facebook中你可以转到你的历史/行动部分,并按时间顺序列出你已经完成并影响到你的所有东西,即使它们彼此无关,只是让你作为普通用户)

我为不同的事件设置了不同的表,每个表都有一个employee_id键和一个"发生的"时间戳,一些表示例:

bonuses
customers
raise
complaints
feedback

因此,无论何时发生事件(即,将新客户分配给员工,或员工获得投诉或提高),都会将新行添加到相应的表中,其中包含影响的员工ID以及发生的时间戳。

我需要一个查询来提取包含该员工的所有记录(例如,最多50个)并返回该员工的历史记录视图。每个表中的字段名称不同(即奖金包括带备注的金额,客户包括客户信息等)。

我需要使用列名称将输出作为摘要视图,例如:

event_type = (new customer, bonus, feedback etc)
date
title (a brief worded title of the type of event, specified in sql based on the table its referencing)
description  (verbiage about the action, such as if its event_type bonus display the bonus amount here, if its a complain show the first 50 characters of the complaint message or the ID of the user that filed the complaint from the complaints table. All done in SQL using if statements and building the value of this field output based on which table it comes from. Such as if its from the customers table IF current_table=customers description='A customer was assigned to you by'.customers.assigner_id).

理想情况下,

有没有办法做到这一点?

我考虑过的另一个选择是,我可以做5-6个不同的查询,从每个表中拉出记录,然后使用mysql命令来进行网格/交错"按时间顺序将所有查询的结果放入一个列表中。这也是可以接受的

1 个答案:

答案 0 :(得分:0)

您可以使用UNION查询将所有信息合并在一起,并使用ORDER BY子句按时间顺序排列操作。每个查询必须具有相同数量的字段。您的ORDER BY子句应该是最后一个。

以下示例假设您在customers表中有一个名为customer_name的字段,在奖金表中有一个bonus_amount字段。

它看起来像这样:

SELECT   'New Customer' as event_type, date, 
         'New customer was assigned' as title, 
         CONCAT('New Customer: ', customer_name, ' was assigned') as description
FROM     customers
WHERE    employee_id = 1

UNION

SELECT   'Bonus' as event_type, date, 
         'Received a bonue' as title, 
         CONCAT('Received a bonus of $', FORMAT(bonus_amount, 2), '.') as description
FROM     bonuses
WHERE    employee_id = 1

UNION

...

ORDER BY date DESC;