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

Форум MySQL

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

 

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

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

тема: SELECT * WHERE field IN (1|8|90|123|37)
 
 автор: kikaha   (21.04.2012 в 07:01)   письмо автору
 
 

Досталась по наследству база, в которой есть таблица с полем, в котором через | перечислены id некоторых сущностей - как в заголовке темы. Изменить быстро форму хранения нереально по разным причинам. Запись может быть такой 1|8|90|123|37, а может содержать только одну цифру - например 1
Сейчас необходимо делать выборки - например выбрать только те строки, которые содержат любые цифры из списка - например выбрать все записи, в которых этот список содержит любую (или все сразу без разницы) цифру из 1,8,90.
Как?

  Ответить  
 
 автор: Valick   (21.04.2012 в 08:10)   письмо автору
 
   для: kikaha   (21.04.2012 в 07:01)
 

Изменить быстро форму хранения нереально по разным причинам
сделать выборку в 10 раз сложнее чем изменить структуру БД

  Ответить  
 
 автор: vbps   (21.04.2012 в 12:54)   письмо автору
 
   для: kikaha   (21.04.2012 в 07:01)
 

Подойдет для выборки по одному значению, больше значений в запросе - больше нагрузка.

(field like '%|".$num."|%')

Что бы это работало, начало и конец строки должны начинаться и заканчиваться на |.
Надо понимать, что такой метод подойдет, если искать одно значение и только если немного записей в таблице, т.к. индекс использоваться не будет.

В остальном как сказал Valick быстрее и проще переделать структуру базы.

  Ответить  
 
 автор: Valick   (21.04.2012 в 17:21)   письмо автору
 
   для: vbps   (21.04.2012 в 12:54)
 

там делов-то создать таблицу связи, перегнать в нее значения 10-ью строчками кода и скорректировать запросы (да и то что-то мне подсказывает, что их не так много, которые относятся к этим данным)

  Ответить  
 
 автор: kikaha   (21.04.2012 в 19:05)   письмо автору
 
   для: Valick   (21.04.2012 в 17:21)
 

CREATE TABLE IF NOT EXISTS `marketplace_offers` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `name` varchar(512) NOT NULL,
  `offer_type` int(10) unsigned NOT NULL,
  `start_date` int(10) unsigned NOT NULL,
  `end_date` int(10) unsigned NOT NULL,
  `address` varchar(1024) NOT NULL,
  `address_coordinates` varchar(64) DEFAULT '',
  `region_id` int(10) unsigned NOT NULL,
  `price` int(10) unsigned DEFAULT '0',
  `payment_conditions` varchar(512) DEFAULT NULL,
  `short_text` text NOT NULL,
  `services` varchar(255) NOT NULL,
  `subjects` varchar(255) NOT NULL,
  `target_audience` varchar(255) NOT NULL,
  `contact_person` varchar(255) NOT NULL,
  `members_max` varchar(32) NOT NULL,
  `trainer_requirements` varchar(512) DEFAULT NULL,
  `requests_end_date` int(10) unsigned NOT NULL,
  `additional_materials` text,
  `is_action` enum('0','1') DEFAULT '0',
  `can_service_exchange` enum('0','1') DEFAULT '0',
  `date` int(10) unsigned NOT NULL,
  `visible` enum('0','1') NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  KEY `offer_type` (`offer_type`),
  KEY `region_id` (`region_id`),
  KEY `user_id` (`user_id`),
  KEY `is_action` (`is_action`),
  KEY `start_date` (`start_date`),
  KEY `end_date` (`end_date`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=252 ;


вот такая таблица, вот одна запись например:

(241, 766, 'blah-blah-blah', 2, 1331503200, 1333141200, 'м. Вінниця за адресою замовника', '', 13, 30000, 'blah-blah-blah', '6', '132|131|133|46|49||13|11|12|25|79|82|81|80|101|41|38|37|32', '7|8|9|11|16|17|19|21|28|29|34|36|37', 'blah-blah-blah', '30', blah-blah-blah', 1331503200, '|', '0', '1', 1330759567, '1'),



в данной таблице таких полей 3:
  `services` varchar(255) NOT NULL,
  `subjects` varchar(255) NOT NULL,
  `target_audience` varchar(255) NOT NULL,


и по каждому из них нужно делать выборки. а таблиц несколько и связанного с добавлением/редактированием кода over9000. очень хочется застрелиться =(

Valick - как тут связей понаделать? у меня сегодня ДР и до следующего в здравом уме я, похоже, не доживу =(

  Ответить  
 
 автор: Valick   (21.04.2012 в 20:54)   письмо автору
 
   для: kikaha   (21.04.2012 в 19:05)
 

`services` varchar(255) NOT NULL,
`subjects` varchar(255) NOT NULL
`target_audience` varchar(255) NOT NULL

это разные сущности? т.е. число 11 содержащееся и там и там это не одно и то же?
полагаю что разные, но спрашиваю на всякий случай

requests_end_date` int(10) unsigned NOT NULL,
что там за странное содержимое? |

  Ответить  
 
 автор: kikaha   (22.04.2012 в 00:16)   письмо автору
 
   для: Valick   (21.04.2012 в 20:54)
 

>это разные сущности? т.е. число 11 содержащееся и там и там это не одно и то же?
>полагаю что разные, но спрашиваю на всякий случай

да, конечно - это разные наборы чисел через |, просто формат одинаковый, вот по этим полям в разных случаях выборки - то есть там сервисы, темы, целевые аудитории, вот по ним и выбирают - а кто например оказывает услуги например петтинга например только мммм.... бухгалтерам? Или уход за котами и почесывание пяток только токарям и только в Коломне =)

>
>requests_end_date` int(10) unsigned NOT NULL,
>что там за странное содержимое? |

вообще там в юникстайме время, так предыдущий автор решил. на содержимое не обращай внимания, нам это несущественно сейчас, я просто чистил лишнее для примера - не то вставил, just ignore this

  Ответить  
 
 автор: Valick   (22.04.2012 в 08:37)   письмо автору
 
   для: kikaha   (22.04.2012 в 00:16)
 

ок.
тогда принцип такой, создаем три таблицы с именами равными именам этих трех полей
делаем выборку
SELECT id, services, subjects, target_audience FROM marketplace_offers

далее формируем запросы INSERT в эти таблицы согласно полям
в первую таблицу id | id_mark | services
значения services можно разобрать explode по "|", а затем собрать с "),($row[id],"
но лучше сделать просто замену "|" на "),($row[id]," при помощи strtr()
сформировав таким образом переменную $s
в итоге получаем многострочный INSERT
$query="INSERT INTO services (id_mark, services) VALUES($row[id],".$s.")";
и так далее для оставшихся двух таблиц
____
хм.. хотел объяснить на пальцах, но что-то плохо получается, наверно надо писать готовый код
а сейчас некогда, поеду к сестре контупер лечить)

  Ответить  
 
 автор: kikaha   (22.04.2012 в 23:47)   письмо автору
 
   для: Valick   (22.04.2012 в 08:37)
 

В общем, создавать вспомогательные таблицы - это тру, но не в моем случае к сожалению - на переделку всех, вовлеченных в эти процедуры скриптов уйдет неделя, а у меня расстрел по расписанию в понедельник, но всё равно спасибо что пытались помочь.
Решение дали тут http://stackoverflow.com/questions/10265316/how-to-select-from-mysql-text-field-type-only-the-numbers-that-divided-by-usil - громоздкое, но работающее

  Ответить  
 
 автор: Valick   (23.04.2012 в 09:00)   письмо автору
 
   для: kikaha   (22.04.2012 в 23:47)
 

на переделку всех, вовлеченных в эти процедуры скриптов уйдет неделя
можно вообще не переделывать, а оставить поля как есть и добавить таблицы, единственное надо будет синхронизировать информацию в полях и таблицах
и при желании переход от полей к таблицам можно растянуть лет на десять :)
___
ну раз вас устраивает предложенный результат, то так тому и быть

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

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