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

Форум MySQL

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

 

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

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

тема: два REGEXP в запросе
 
 автор: mikha   (25.01.2009 в 13:46)   письмо автору
 
 

Есть вот такой запрос,
"SELECT .... FROM ... WHERE `node` REGEXP '[[:<:]](39|7|2|9|5|16|15|3|13|10)[[:>:]]' AND ... ORDER BY ... LIMIT ..."

где `node`, это вложеные категории (уровень вложенности может быть любым), в данном случае новостей.
В них же, кроме разделения по рубрикам, ещё и разделение по регионам, тоже вложено.
Т.е примерно так
По регионам
--В мире
--Россия
----ДФО
------город1
------город2
----Другой регион
------город1
------город2
По рубрикам
--Авто
--Бизнес
--Спорт
При добавлении поста (нововсти), выбераются ID добавляемых категорий (разделов), они записываются через запятую в `node`. Есть причины, по которым необходдимо отделить "Регионы" от "Рубрик". А так как некоторые новости могут принадлежать нескольким регионам, то ничего в голову не приходит как добавить ещё к примеру `region`, куда и записывать ID регионов через запятую.
Собственно вопрос в чём, намного увеличится скорость выполнения запросов? Запрос примет примерно такой вид
"SELECT ... FROM ... WHERE `node` REGEXP '[[:<:]](15|3|13|10)[[:>:]]' AND `region` REGEXP '[[:<:]](39|7|2|9)[[:>:]]'  AND ... ORDER BY ... LIMIT ..."

Стоит замарачиваться или думать над другими вариантами?

  Ответить  
 
 автор: Trianon   (25.01.2009 в 14:50)   письмо автору
 
   для: mikha   (25.01.2009 в 13:46)
 

таблица связей

  Ответить  
 
 автор: mikha   (25.01.2009 в 16:14)   письмо автору
 
   для: Trianon   (25.01.2009 в 14:50)
 

Касательно связи одной статьи с несколькими разделами - делается по стандартной схеме отношения M:N добавлением промежуточной таблицы фиксирующей факт размещения статьи X в разделе Y . location (id| c_id | st_id) (с) Trianon
Кажется это то что надо.
Спасибо большое.
Мне приходило в голову что можно как то "уникализовать", не знаю как правильно выразиться, записи в `node`, но не приходило в голову вынести это в отдельную таблицу, а в `node` писать ID возможной комбинации разделов.
Я правильно понял?

  Ответить  
 
 автор: Trianon   (25.01.2009 в 16:23)   письмо автору
 
   для: mikha   (25.01.2009 в 16:14)
 

node вообще уходит из таблицы.
Строк с нужными комбинациями может оказаться несколько.
region_link (id, news_id, region_id)
rubric_link (id, news_id, rubric_id)

По большому счету поля id в обоих связующих таблицах необязательные.
Первичный ключ можно сделать и составным (из оставшихся двух полей)

  Ответить  
 
 автор: mikha   (25.01.2009 в 16:46)   письмо автору
 
   для: Trianon   (25.01.2009 в 16:23)
 

Если честно не совсем понял..
А как в таком случае, примерно разумеется, будет выглядеть запрос?
К примеру вывести новости из где region_id 5, 11, 24 и rubric_id 2, 6, 8
И это.. В таком случае получается колличество записей в region_link и rubric_link будет равно колличеству новостей? Но поля INT, я просто размышляю вслух..
В моём же варианте, колличество записей будет равно колличеству различных комбинаций.
Т.е находим комбинацию, по её ID ищем новости..
Не думаю что я изобрёл что то новое, было бы это оптимально, так бы и делали.
Просто я в этом пока не очень)))
И так))) Можно примерный запрос?

  Ответить  
 
 автор: Trianon   (25.01.2009 в 17:10)   письмо автору
 
   для: mikha   (25.01.2009 в 16:46)
 

Наверняка пример надуманный.
Тем не менее
SELECT * FROM news WHERE id IN 
  (SELECT news_id 
    FROM region_link JOIN rubric_link USING(news_id) 
    WHERE region_id IN (5,11,24) AND rubric_id IN (2,6,8))


это для 5-го и выше MySQL
для 4.1 чуть более громоздко будет.

  Ответить  
 
 автор: mikha   (25.01.2009 в 17:29)   письмо автору
 
   для: Trianon   (25.01.2009 в 17:10)
 

Спасибо большое!!!
Будем дальше кубатурить)))

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

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