MySQL 将 "select where id in select" 更改为某种连接
MySQL change "select where id in select" to some kind of join
情况:
我有一个table"trips"旅游
tripid country city
1 UK London
2 US New York
3 US Las Vegas
我有一个 table "prices" 价格
tripid price duration
1 200 8
1 400 10
1 600 12
2 300 5
2 900 15
3 50 10
3 150 30
现在假设我想在美国进行所有价格在 50 到 200 之间的旅行
然后我使用这个 SQL 查询:
SELECT trip.* FROM `trips` WHERE `country` = 'US' AND `tripid` in
(SELECT tripid FROM `prices` WHERE `price` BETWEEN 50 and 200 GROUP BY tripid)
当然这一个运行良好,但我的 table 正在增长,这是 SLOWWW。这是因为子查询效率很低
我该怎么做才能摆脱这部分并使其更快?
您可以在此处尝试使用 INNER JOIN 而不是子选择:
SELECT trip.* FROM trips INNER JOIN prices USING (tripid)
WHERE price BETWEEN 50 AND 200 AND country='US' GROUP BY tripid
确保你在 trips
.country
上有一个索引用于你的 WHERE 子句,并且在 prices
.[=14 上有一个索引可能也会有所帮助=] 用于 BETWEEN 子句。
如果您不想在结果中加入价格行,请使用 EXIST
子句:
SELECT t.*
FROM trips t
WHERE t.country = 'US' AND exists (select 1 FROM prices WHERE t.id = tripid AND price BETWEEN 50 and 200)
不需要任何 GROUP
子句。
情况:
我有一个table"trips"旅游
tripid country city
1 UK London
2 US New York
3 US Las Vegas
我有一个 table "prices" 价格
tripid price duration
1 200 8
1 400 10
1 600 12
2 300 5
2 900 15
3 50 10
3 150 30
现在假设我想在美国进行所有价格在 50 到 200 之间的旅行
然后我使用这个 SQL 查询:
SELECT trip.* FROM `trips` WHERE `country` = 'US' AND `tripid` in
(SELECT tripid FROM `prices` WHERE `price` BETWEEN 50 and 200 GROUP BY tripid)
当然这一个运行良好,但我的 table 正在增长,这是 SLOWWW。这是因为子查询效率很低
我该怎么做才能摆脱这部分并使其更快?
您可以在此处尝试使用 INNER JOIN 而不是子选择:
SELECT trip.* FROM trips INNER JOIN prices USING (tripid)
WHERE price BETWEEN 50 AND 200 AND country='US' GROUP BY tripid
确保你在 trips
.country
上有一个索引用于你的 WHERE 子句,并且在 prices
.[=14 上有一个索引可能也会有所帮助=] 用于 BETWEEN 子句。
如果您不想在结果中加入价格行,请使用 EXIST
子句:
SELECT t.*
FROM trips t
WHERE t.country = 'US' AND exists (select 1 FROM prices WHERE t.id = tripid AND price BETWEEN 50 and 200)
不需要任何 GROUP
子句。