MySQL更改"选择select in"某种加入

时间:2015-01-20 22:54:27

标签: mysql sql inner-join

情况:

我有一张桌子"旅行"旅游旅行

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)

当然这个工作得很好,但我的桌子正在增长,这很慢。这是因为子查询的效率非常低。

我可以做些什么才能让这部分变得更快并使其更快?

2 个答案:

答案 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子句上有tripscountry的索引,并且它可能也有助于在prices上建立索引。duration对于BETWEEN条款。