需要帮助优化查询

Sim*_*mon 5 php mysql performance join phpmyadmin

我有两张桌子 - incoming tours(id,name)incoming_tours_cities(id_parrent, id_city)

id在第一个表中是唯一的,并且对于第一个表中的每个唯一行,id_city在第二个表中有- s列表(即id_parrent第二个表等于id第一个表)

例如

incoming_tours

|--id--|------name-----|
|---1--|---first_tour--|
|---2--|--second_tour--|
|---3--|--thirth_tour--|
|---4--|--hourth_tour--|
Run Code Online (Sandbox Code Playgroud)

incoming_tours_cities

|-id_parrent-|-id_city-|
|------1-----|---4-----|
|------1-----|---5-----|
|------1-----|---27----|
|------1-----|---74----|
|------2-----|---1-----|
|------2-----|---5-----|
........................
Run Code Online (Sandbox Code Playgroud)

这意味着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'
Run Code Online (Sandbox Code Playgroud)

这很好.

但我动态生成查询,当连接数很大(大约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'
Run Code Online (Sandbox Code Playgroud)

查询运行45s(尽管我在表中设置了索引)

我能做些什么来优化呢?

非常感谢

kso*_*gor 6

SELECT t.name
FROM incoming_tours t INNER JOIN 
  ( SELECT id_parrent
    FROM incoming_tours_cities
    WHERE id IN (4, 74)
    GROUP BY id_parrent
    HAVING count(id_city) = 2) resultset 
  ON resultset.id_parrent = t.id
Run Code Online (Sandbox Code Playgroud)

但是你需要改变总城市数量.