У меня есть нечетная схема БД, с которой я работаю и пытаюсь исправить.
У меня есть две таблицы listtimeentry
и listexpenseentry
, которые сопоставляются с другими таблицами бизнес-сущностей, такими как listsalesorders
, listinvoices
et c.
Это делается с помощью двух таблиц сопоставления. Когда строка вставляется в listtimeentry
или listexpenseentry
, ее идентификатор вставляется в таблицу listlineitems
, которая имеет вид
id itemId type
=============================
1 4 1
2 4 2
3 5 1
, где id - это просто обычное автоматическое увеличение PK для позиций и itemId
относится к идентификатору в listtimeentry
или listexpenseentry
- на основе столбца type
. Если тип равен 1, то itemId ссылается на строку в listtimeentry
, если тип равен 2, то на строку в listexpenseentry
.
Тогда у меня есть таблица типа mapsalesorderitems
, которая отображает listsalesorder
идентификатор для PK listlineitems
, тот же формат для invoices
и другие бизнес-объекты.
Мой вопрос заключается в том, как условно присоединиться к этой информации. Например, я хочу присоединиться к таблице users
, чтобы я мог отобразить имя того, кто сделал запись времени или кто сделал запись расходов. Поэтому, если тип listlineitems
равен 1, я хочу присоединиться к пользователям на listtimeentry
, иначе я хочу присоединиться к пользователям на listexpenseentry
. Прямо сейчас я делаю это так -
SELECT
0 as 'Check',
lli.type,
if(lli.type=1,lte.dateEntered,lee.dateEntered) as 'DateEntered',
lli.itemId as 'parentTableIdx',
if(lli.type=1,lte.parentProjectId,lee.parentProjectId) as 'parentProjectIdx',
lli.idx as 'ID',
if(lli.type=1, if(lte.active=1,'Active','Inactive'), if(lee.active=1,'Active','Inactive')) as 'Active/Inactive',
if(lli.type=1,CONCAT(lu.FirstName,' ',lu.LastName),CONCAT(luu.FirstName,' ',luu.LastName)) as 'Employee',
IF(lli.type-1,'Time Entry','Expense Entry') as 'Type'
FROM listlineitems lli
LEFT JOIN listtimeentry lte ON (lte.idx = lli.itemId AND lli.type = 1)
LEFT JOIN listexpenseentry lee ON (lee.idx = lli.itemId AND lli.type = 2)
LEFT JOIN listusers lu ON lu.idx = lte.individualId
LEFT JOIN listusers luu ON luu.idx = lee.individualId
ORDER BY lli.idx DESC
Так что я должен дважды войти в список пользователей. Это то, как я собираюсь это сделать? Есть ли лучший способ организовать это или сделать это объединение?