2015-01-20 35 views
0

現狀:MySQL變遷「中選擇其中id中選擇」以某種加入

我有一個表「遊」與旅遊人次

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) 

當然這個工作正常,但我的桌子正在增長,這是SLOWWW。這是因爲子查詢效率非常低。

我該怎麼做才能讓這部分出來並使其更快?

+0

試一試存在'SELECT trip。* FROM trips WHERE country ='US'AND EXISTS (SELECT 1 FROM prices WHERE price BETWEEN 50 and 200 AND prices.tripid = trip.tripid GROUP BY tripid)' – Mihai 2015-01-20 23:03:31

回答

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條款。

+0

我認爲你是對的。這比「內部加入和分組」更快! – NLAnaconda 2015-01-20 23:14:49

0

您可以嘗試使用一個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上有一個索引。 BETWEEN子句中的duration

+0

This drasticly改善了加載時間。謝謝! – NLAnaconda 2015-01-20 23:00:49

+1

@ user2740744:請注意,這是無效的SQL。其他每個DBMS都會拒絕使用「GROUP BY」子句。 MySQL選擇返回隨機數據(他們稱之爲不確定)。詳情在這裏:http://www.mysqlperformanceblog.com/2006/09/06/wrong-group-by-makes-your-queries-fragile/ – 2015-01-20 23:17:14

+0

謝謝,我認爲下面的Jon Hinsons回答更好。 – NLAnaconda 2015-01-20 23:19:00