|
|
|
| В MySQL можно выполнить вот такой запрос
SELECT `id` FROM `offer` WHERE `category` REGEXP '[[:<:]](32|29|30|24|19|17)[[:>:]]' LIMIT 0,10
|
И получить id товаров, если он принадлежат хоть одной из перечисленных выше категорий. Категории в `category` через запятую
В SQLite3 REGEXP вроде как нет, извернулся пока таким образом
function xxxxxxxxxx($category1, $category2){
return array_intersect(explode(",", $category1), explode(",", $category2)) ? true : false;
}
$db->createFunction("xxxxxxxxxx", "xxxxxxxxxx", 2);
$result = $db->query("SELECT `id` FROM `offer` WHERE xxxxxxxxxx('100001,2102,1946,1941,2193,1938,2190,1935,2188,1933,2104,1931,2101,1945,2194,1940,2192,1936,2189,1934,2187,1932', `category`) LIMIT 0, 10");
|
Вопрос, как можно сделать пошустрее? Не перекраивая структуру базы данных. | |
|
|
|
|
|
|
|
для: mikha
(22.03.2013 в 11:32)
| | Лучше в таком случае использовать оператор IN - он на порядок быстрее любых регулярных выражений
SELECT `id` FROM `offer` WHERE `category` IN(32, 29, 30, 24, 19, 17) LIMIT 0,10
|
| |
|
|
|
|
|
|
|
для: cheops
(23.03.2013 в 08:41)
| | Товар может принадлежать нескольким категориям.
Уже извернулся, добавив таблицу связей.
Запрос приобрёл вид
SELECT * FROM `offer` WHERE `id` IN(SELECT `id` FROM `offer_category_id` WHERE `category_id` IN(2,3,5,6)) LIMIT 20, 5
|
Товара не много, работает достаточно шустро. | |
|
|
|
|
|
|
|
для: mikha
(24.03.2013 в 07:49)
| | EXPLAIN посмотрите что показывает. Возможно, при условии индексации, выгоднее окажется двухтабличный, а не вложенный запрос
SELECT
o.*
FROM
offer AS o
JOIN
offer_category_id AS c
ON
o.id = c.id
WHERE
c.category_id IN(2,3,5,6)
LIMIT
20, 5
|
| |
|
|
|
|
|
|
|
для: cheops
(26.03.2013 в 22:09)
| | Спасибо. Обязательно попробую. | |
|
|
|