Я хочу объединить ниже запросы, чтобы сократить время выполнения, есть всего 10 таблиц, из которых я хочу получить данные, и 11-я таблица, по которой я могу выполнить JOIN
. У меня есть столбец datetime
в каждой таблице, и я хочу получить данные на основе этого столбца datetime
, данные только из той таблицы, в которой сопоставлено заданное условие даты.
$qry1 = "SELECT m.fullName, l.loanAmount AS loanAmount, l.loanStartDate FROM tblMember m
LEFT JOIN tblLoan l ON m.memberNumber = l.memberNumber
WHERE l.loanStartDate = '$date' AND l.is_active!=2";
$qry1_1 = "SELECT m.fullName, li.installment_amount, li.interest_amount , li.installment_added_date, li.installment_comment FROM tblMember m
LEFT JOIN tblLoan l ON m.memberNumber = l.memberNumber
LEFT JOIN tblLoanInstallments li ON l.id = li.loan_id
WHERE li.installment_added_date = '$date' AND li.status=1";
$qry2 = "SELECT m.fullName, f.fdAmount, f.fdStartDate FROM tblMember m
LEFT JOIN tblFD f ON m.memberNumber = f.memberNumber
WHERE f.fdStartDate = '$date' AND f.is_active = 1";
$qry2_2 = "SELECT m.fullName, fi.installment_amount, fi.interest_amount, fi.installment_added_date, fi.installment_comment FROM tblMember m
LEFT JOIN tblFD f ON m.memberNumber = f.memberNumber
LEFT JOIN tblFDInstallments fi ON f.id = fi.fd_id
WHERE fi.installment_added_date = '$date' AND fi.status != 2";
$qry3 = "SELECT m.fullName, shi.saving_amount, shi.installment_amount, shi.interest_amount, shi.installment_added_date, shi.installment_comment FROM tblMember m
LEFT JOIN tblShare sh ON m.memberNumber = sh.memberNumber
LEFT JOIN tblShareInstallments shi ON sh.id = shi.s_id
WHERE shi.installment_added_date = '$date' AND shi.status != 2";
$qry4 = "SELECT m.fullName, si.saving_amount, si.installment_amount, si.interest_amount, si.installment_added_date, si.installment_comment FROM tblMember m
LEFT JOIN tblOnlySaving s ON m.memberNumber = s.memberNumber
LEFT JOIN tblSavingInstallments si ON s.id = si.s_id
WHERE si.installment_added_date = '$date' AND si.status != 2";
$qry5 = "SELECT m.fullName, csi.installment_amount, csi.interest_amount, csi.installment_added_date, csi.installment_comment FROM tblMember m
LEFT JOIN tblCompulsorySaving cs ON m.memberNumber = cs.memberNumber
LEFT JOIN tblCSSavingInstallments csi ON cs.id = csi.s_id
WHERE csi.installment_added_date = '$date' AND csi.status != 2";
Как оптимизироватьэти запросы? Я пытался присоединиться ко всей таблице, но он выполняется до 6-7 минут, чем выдает ошибку
SELECT
m.fullName,
l.loanAmount AS loanAmount,
l.loanStartDate,
li.installment_amount,
li.interest_amount,
li.installment_added_date,
f.fdAmount,
f.fdStartDate,
fi.installment_amount,
fi.interest_amount,
fi.installment_added_date,
shi.saving_amount,
shi.installment_amount,
shi.interest_amount,
shi.installment_added_date,
shi.installment_comment,
si.saving_amount,
si.installment_amount,
si.interest_amount,
si.installment_added_date,
si.installment_comment,
csi.installment_amount,
csi.interest_amount,
csi.installment_added_date,
csi.installment_comment
FROM
tblMember m
LEFT JOIN
tblLoan l ON m.memberNumber = l.memberNumber
LEFT JOIN
tblLoanInstallments li ON l.id = li.loan_id
LEFT JOIN
tblFD f ON m.memberNumber = f.memberNumber
LEFT JOIN
tblFDInstallments fi ON f.id = fi.fd_id
LEFT JOIN
tblShare sh ON m.memberNumber = sh.memberNumber
LEFT JOIN
tblShareInstallments shi ON sh.id = shi.s_id
LEFT JOIN
tblOnlySaving s ON m.memberNumber = s.memberNumber
LEFT JOIN
tblSavingInstallments si ON s.id = si.s_id
LEFT JOIN
tblCompulsorySaving cs ON m.memberNumber = cs.memberNumber
LEFT JOIN
tblCSSavingInstallments csi ON cs.id = csi.s_id
WHERE
(MONTH(l.loanStartDate) = '5'
AND YEAR(l.loanStartDate) = '2018'
AND l.is_active != 2)
OR (MONTH(li.installment_added_date) = '5'
AND YEAR(li.installment_added_date) = '2018'
AND li.status = 1)
OR (MONTH(f.fdStartDate) = '5'
AND YEAR(f.fdStartDate) = '2018'
AND f.is_active != 2)
OR (MONTH(fi.installment_added_date) = '5'
AND YEAR(fi.installment_added_date) = '2018'
AND fi.status = 1)
OR (MONTH(shi.installment_added_date) = '5'
AND YEAR(shi.installment_added_date) = '2018'
AND shi.status = 1)
OR (MONTH(si.installment_added_date) = '5'
AND YEAR(si.installment_added_date) = '2018'
AND si.status = 1)
OR (MONTH(csi.installment_added_date) = '5'
AND YEAR(csi.installment_added_date) = '2018'
AND csi.status = 1)
WHERE
условие отличается в обоих запросах, потому что ранее я давал дату от начала и теперь я хочуизмените это на месяц. Все таблицы имеют около 10000 записей, а запрос может содержать 1000-2000 строк RESULT