С таблицами пар ключ-значение, как указано в вашем сообщении, ваши данные представлены в формате long , где различные типы единиц значений и индикаторов находятся в двух столбцах: key и значение .Следовательно, каждое условие AND
пытается выбрать одну пару условий логики key и value и не может встретить все сразу, если только такие значения, как цена , комнаты и sqft хранятся в своих определенных столбцах в формате wide .
Долгосрочное решение
Существует длинный вопрос об использовании модели значений атрибутов сущностей, такой как SO post в реляционных базах данных.Долгосрочное решение для эффективной фильтрации взаимно включающих условий состоит в том, чтобы перестроить вашу таблицу в широкоформатный формат, где значения находятся в своих собственных столбцах и где запросы намного проще с условиями AND
.
CREATE TABLE tableXY (
`price` DOUBLE,
`room` INT
`sqlft` INT,
... OTHER indicators ...
);
SELECT *
FROM tableXY
WHERE `price` BETWEEN 100 AND 200
AND `rooms` BETWEEN 2 AND 5
AND `sqft` BETWEEN 40 AND 80
Краткосрочное решение
Но краткосрочным решением для существующего длинного формата является запуск условных агрегаций для создания «псевдостолбцов» значений: цена , комнаты , sqft .Добавьте GROUP BY
для любых статических атрибутов (имена, местоположения, время и т. Д.).
CREATE TABLE tableXY (
`key` VARCHAR(10),
`value` INT
);
SELECT sub.*
FROM
(SELECT CASE WHEN `key` = 'name' THEN `key` ELSE NULL END AS `name`,
SUM(CASE
WHEN `key` = 'price'
THEN `value`
ELSE NULL
END) AS price,
SUM(CASE
WHEN `key` = 'rooms'
THEN `value`
ELSE NULL
END) AS rooms,
SUM(CASE
WHEN `key` = 'sqlft'
THEN `value
ELSE NULL
END) AS sqft,
-- ...other values...
FROM tableXY
GROUP BY CASE WHEN `key` = 'name' THEN `key` ELSE NULL END
) AS sub
WHERE sub.price BETWEEN 100 AND 200
AND sub.rooms BETWEEN 2 AND 5
AND sub.sqft BETWEEN 40 AND 80