2014-12-14 1 views
1

Я работаю над системой управления сотрудниками/вознаграждением и должен иметь возможность показать одну страницу истории транзакций, которая показывает в хронологическом порядке различные события, которые имеет сотрудник опытный в одном списке. (Например, как в facebook вы можете перейти в свою историю/раздел действий и просмотреть хронологический список всех вещей, которые вы сделали, и повлиять на вас, даже если они не связаны друг с другом и просто имеют вас как общего пользователя)Вытягивание разных записей из нескольких таблиц как один список истории транзакций

у меня есть различные таблицы для различных событий, каждая таблица имеет ключ eMPLOYEE_ID и «произошло» метку времени, некоторые примеры таблиц:

bonuses 
customers 
raise 
complaints 
feedback 

Поэтому, когда происходит событие (т.е. новый клиент присваивается работнику , или сотрудник получает жалобу или рейз), новая строка добавляется в соответствующую таблицу с идентификатором сотрудника, на который он влияет, и меткой времени, когда она произошла.

Мне нужен один запрос, чтобы вытащить все записи (например, до 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 для «mesh/interleave» результатов из всех запросов в один список по хронологическим заказ. Это было бы приемлемо также

ответ

0

Вы можете использовать запрос UNION, чтобы объединить всю информацию вместе и использовать предложение ORDER BY, чтобы заказать действия в хронологическом порядке. Каждый запрос должен иметь одинаковое количество полей. Ваша статья ORDER BY должна быть последней.

Приведенные ниже примеры предполагают, что у вас есть поле customer_name в таблице Customers и 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; 
+0

Спасибо за предложение. Не могли бы вы объяснить, как вы можете написать одно из выражений? (Выберите любой образец условий). Его времена были с тех пор, как Ive использовал выражения таким образом и нарисовал пробел в синтаксисе (поиск теперь, но получение множества общих выражений WHERE, или если у вас есть ссылка на эту конкретную статью об использовании kb, которая тоже будет работать) –

+0

Я дал пару примеров. – Tom