У меня есть две таблицы - incoming tours(id,name)
и incoming_tours_cities(id_parrent, id_city)
id
в первой таблице уникален, и для каждой уникальной строки из первой таблицы есть список id_city
- во второй таблице (т. Е. id_parrent
во второй таблице равен id
из первой таблицы )
Например
incoming_tours
|--id--|------name-----|
|---1--|---first_tour--|
|---2--|--second_tour--|
|---3--|--thirth_tour--|
|---4--|--hourth_tour--|
incoming_tours_cities
|-id_parrent-|-id_city-|
|------1-----|---4-----|
|------1-----|---5-----|
|------1-----|---27----|
|------1-----|---74----|
|------2-----|---1-----|
|------2-----|---5-----|
........................
Это означает, что first_tour
имеет список городов - ("4","5","27","74")
И second_tour
имеет список городов - ("1","5")
Предположим, у меня есть два значения - 4
и 74
:
Теперь мне нужно получить все строки из первой таблицы, где мои оба значения находятся в списке городов. т.е. он должен возвращать только first_tour (потому что 4 и 74 находятся в его списке городов)
Итак, я написал следующий запрос
SELECT t.name
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '4'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '74'
И это прекрасно работает.
Но я генерирую запрос динамически, а когда количество соединений велико (около 15), запрос замедляется.
т.е. когда я пытаюсь запустить
SELECT t.name
FROM `incoming_tours` t
JOIN `incoming_tours_cities` tc0 ON tc0.id_parrent = t.id
AND tc0.id_city = '4'
JOIN `incoming_tours_cities` tc1 ON tc1.id_parrent = t.id
AND tc1.id_city = '74'
.........................................................
JOIN `incoming_tours_cities` tc15 ON tc15.id_parrent = t.id
AND tc15.id_city = 'some_value'
запрос выполняется в 45s
(несмотря на то, что я установил индексы в таблицах)
Что я могу сделать, чтобы оптимизировать это?
Большое спасибо