Как отфильтровать наборы данных пользователей, сузив их из тех же наборов данных в SQL? - 61 объединяет лимитную проблему - PullRequest
0 голосов
/ 21 марта 2020

Я внедряю систему спортивного тестирования, где люди вводят результаты своих упражнений. Я пытаюсь перечислить результаты упражнений, отфильтрованных со значениями результатов других упражнений. Я использую платформу 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 стол в объединении"

Пожалуйста, помогите. Что делать ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...