Mysql запрос результатов вокруг некоторого идентификатора - PullRequest
0 голосов
/ 24 января 2012

Допустим, у меня есть такая таблица:

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 ]

3 голосов
/ 24 января 2012

То, что у вас есть, хорошо.Вы можете объединить в одном запросе с 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 голосов
/ 24 января 2012

Вы можете использовать оператор BETWEEN, например,

SELECT * FROM houses WHERE typeOfHouse=20 AND price BETWEEN 1241 AND 1245 ORDER BY price
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...