情况:
我有一张桌子"旅行"旅游旅行
tripid country city
1 UK London
2 US New York
3 US Las Vegas
我有一张桌子"价格"价格
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)
当然这个工作得很好,但我的桌子正在增长,这很慢。这是因为子查询的效率非常低。
我可以做些什么才能让这部分变得更快并使其更快?
答案 0 :(得分:1)
如果您不想加入结果中的价格行,请使用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
条款。
答案 1 :(得分:0)
您可以尝试在此处使用INNER JOIN而不是子选择:
SELECT trip.* FROM trips INNER JOIN prices USING (tripid)
WHERE price BETWEEN 50 AND 200 AND country='US' GROUP BY tripid
确保您的WHERE子句上有trips
。country
的索引,并且它可能也有助于在prices
上建立索引。duration
对于BETWEEN条款。