Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: SQLite3 REGEXP
 
 автор: mikha   (22.03.2013 в 11:32)   письмо автору
 
 

В 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");

Вопрос, как можно сделать пошустрее? Не перекраивая структуру базы данных.

  Ответить  
 
 автор: cheops   (23.03.2013 в 08:41)   письмо автору
 
   для: mikha   (22.03.2013 в 11:32)
 

Лучше в таком случае использовать оператор IN - он на порядок быстрее любых регулярных выражений
SELECT `id` FROM `offer` WHERE `category` IN(32, 29, 30, 24, 19, 17) LIMIT 0,10

  Ответить  
 
 автор: mikha   (24.03.2013 в 07:49)   письмо автору
 
   для: 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

Товара не много, работает достаточно шустро.

  Ответить  
 
 автор: cheops   (26.03.2013 в 22:09)   письмо автору
 
   для: 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

  Ответить  
 
 автор: mikha   (02.04.2013 в 14:16)   письмо автору
 
   для: cheops   (26.03.2013 в 22:09)
 

Спасибо. Обязательно попробую.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования