ВЫБИРАЕТСЯ с помощью таблицы отображения с несколькими таблицами? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть нечетная схема БД, с которой я работаю и пытаюсь исправить.

У меня есть две таблицы 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

Так что я должен дважды войти в список пользователей. Это то, как я собираюсь это сделать? Есть ли лучший способ организовать это или сделать это объединение?

...