2012-01-24 36 views
0

比方說,我有表是這樣的:周圍的一些ID MySQL查詢結果

id: PRIMARY INT 
price: INT (in dollars) 
typeOfHouse: TINYINT (enumerated house types) 

和存在的元組,讓我們說(ID = 3,價格= 1243,typeOfHouse = 20)。

現在我想選擇2個更便宜的房子和2個支出者(2個,2個)。這可能有兩個查詢(UNION)來完成:

SELECT * FROM houses WHERE typeOfHouse=20 AND price>=1243 ORDER BY price LIMIT 3 
SELECT * FROM houses WHERE typeOfHouse=20 AND price<=1243 ORDER BY price DESC LIMIT 3 

這是一個假設的例子,該情況將會在一般的要複雜得多,所以這個問題是 - 是有可能做到這一點更快在一個查詢,所以條件選擇不必執行兩次。

回答

2

你有什麼是好的。您可以在一個查詢中結合了UNION

SELECT * 
    FROM houses 
    WHERE typeOfHouse = 20  --- there may be more more houses 
     AND price = 1243   --- with same price 
UNION ALL 
    SELECT * 
    FROM houses 
    WHERE typeOfHouse = 20 
     AND price > 1243 
    ORDER BY price 
    LIMIT 2 
UNION ALL 
    SELECT * 
    FROM houses 
    WHERE typeOfHouse = 20 
     AND price < 1243 
    ORDER BY price DESC 
    LIMIT 2 

如果在price或指數 - 甚至更好 - 上(typeOfHouse, price)一個複合索引,你不必擔心性能。

+0

來自問題:這是一個假設的例子,條件通常會更加複雜,所以問題是 - 是否可以在一個查詢中更快地做到這一點,因此條件選擇不必執行兩次。 –

+0

通過你的努力獲得+1。 –

+0

它取決於條件的複雜程度,表格中的索引以及條件的選擇性。 –

0

您可以使用BETWEEN運算符,例如,

SELECT * FROM houses WHERE typeOfHouse=20 AND price BETWEEN 1241 AND 1245 ORDER BY price 
+2

如果房價是(按此順序)1235,1239,1243,1244,1247? – glglgl

+0

價格以美元爲單位。他們不是行列或類似的東西。 –