Tengo dos tablas - incoming tours(id,name)
y incoming_tours_cities(id_parrent, id_city)
necesita ayuda en la optimización de consulta
id
en primera tabla es única, y para cada fila única desde primera tabla se encuentra la lista de id_city
- s en la segunda tabla (es decir id_parrent
en segunda tabla es igual a id
de primera tabla)
Por ejemplo
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-----|
........................
Eso significa que first_tour
lista de ciudades tiene - ("4","5","27","74")
Y second_tour
tiene lista de ciudades - ("1","5")
Supongamos que tengo dos valores - 4
y 74
:
Ahora, necesito obtener todas las filas de la primera tabla, donde mis ambos valores están en la lista de ciudades. es decir que debe devolver sólo el first_tour (porque 4 y 74 se encuentran en su lista de ciudades)
Así, escribí la siguiente consulta
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'
y que funciona bien.
Pero genero la consulta dinámicamente, y cuando el recuento de uniones es grande (alrededor de 15) la consulta se ralentiza.
es decir, cuando trato de correr a correr
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'
la consulta en 45s
(a pesar de que puse índices en las tablas)
¿Qué puedo hacer yo, para que Optimaze?
Muchas gracias
¿se une a la misma tabla 14 veces? –
SÍ, porque tengo que verificar 14 valores. – Simon
si hay otra forma de alcanzar el mismo efecto, por favor dígame cómo – Simon