Я внедряю систему спортивного тестирования, где люди вводят результаты своих упражнений. Я пытаюсь перечислить результаты упражнений, отфильтрованных со значениями результатов других упражнений. Я использую платформу Codeigniter для построения SQL.
Вот таблицы БД:
"tests"
| id | users_id | test_date |
------------------------------
| 1 | 1 | 2020-03-10 |
| 2 | 1 | 2020-03-12 |
| 3 | 2 | 2020-03-09 |
| 4 | 2 | 2020-03-13 |
"exercises"
| id | name |
------------------
| 1 | exercise1 |
| 2 | exercise2 |
| 3 | exercise3 |
| 4 | exercise4 |
| 5 | exercise5 |
| 6 | exercise6 |
"results"
| id | tests_id | exercieses_id | result |
------------------------------------------
| 1 | 1 | 1 | 35 |
| 2 | 1 | 2 | 12 |
| 3 | 1 | 3 | 23 |
| 4 | 1 | 4 | 34 |
| 5 | 1 | 5 | 45 |
| 6 | 1 | 6 | 56 |
| 7 | 2 | 1 | 67 |
| 8 | 2 | 2 | 12 |
| 9 | 2 | 3 | 54 |
| 10 | 2 | 4 | 89 |
| 11 | 2 | 5 | 35 |
| 12 | 2 | 6 | 31 |
| 13 | 3 | 1 | 35 |
| 14 | 3 | 2 | 12 |
| 15 | 3 | 3 | 23 |
| 16 | 3 | 4 | 34 |
| 17 | 3 | 5 | 45 |
| 18 | 3 | 6 | 56 |
| 19 | 4 | 1 | 67 |
| 20 | 4 | 2 | 12 |
| 21 | 4 | 3 | 54 |
| 22 | 4 | 4 | 89 |
| 23 | 4 | 5 | 35 |
| 24 | 4 | 6 | 31 |
Базовый запрос:
$this->db->select('exercises.id, exercises.name, results.result, tests.test_date');
$this->db->from('results');
$this->db->join('tests', 'tests.id = results.tests_id');
$this->db->join('exercises', 'exercises.id = results.exercises_id');
$this->db->order_by('exercises.id');
, и он работает хорошо.
Теперь я добавляю фильтрацию всех результатов с выбранными диапазонами сужения результатов, определяемыми минимальными и максимальными значениями. Они упакованы в массив:
$exercises_results_to_filter = array('exercise1' => array('id' => 1, 'min' => 20, 'max' => 30),
'exercise2' => array('id' => 2, 'min' => 24, 'max' => 28),
... and so on);
Поскольку у меня много упражнений, поэтому я делаю этот запрос l oop:
foreach ($exercises_results_to_filter as $name => $exercise)
{
$this->db->join('results AS results_'.$name, 'results_'.$name.'.tests_id = results.tests_id', 'INNER');
$this->db->where('results_'.$name.'.exercises_id = '.$exercise['id']);
$this->db->where('results_'.$name.'.result BETWEEN '.$exercise['min'].' AND '.$exercise['max']);
}
и выше, также работает хорошо, но только для небольшое количество JOINs
. Когда 200 упражнений go в работу mySQL кричит мне, что "Слишком много таблиц; MySQL может использовать только 61 стол в объединении"
Пожалуйста, помогите. Что делать ??