|
|
|
| Досталась по наследству база, в которой есть таблица с полем, в котором через | перечислены id некоторых сущностей - как в заголовке темы. Изменить быстро форму хранения нереально по разным причинам. Запись может быть такой 1|8|90|123|37, а может содержать только одну цифру - например 1
Сейчас необходимо делать выборки - например выбрать только те строки, которые содержат любые цифры из списка - например выбрать все записи, в которых этот список содержит любую (или все сразу без разницы) цифру из 1,8,90.
Как? | |
|
|
|
|
|
|
|
для: kikaha
(21.04.2012 в 07:01)
| | Изменить быстро форму хранения нереально по разным причинам
сделать выборку в 10 раз сложнее чем изменить структуру БД | |
|
|
|
|
|
|
|
для: kikaha
(21.04.2012 в 07:01)
| | Подойдет для выборки по одному значению, больше значений в запросе - больше нагрузка.
(field like '%|".$num."|%')
Что бы это работало, начало и конец строки должны начинаться и заканчиваться на |.
Надо понимать, что такой метод подойдет, если искать одно значение и только если немного записей в таблице, т.к. индекс использоваться не будет.
В остальном как сказал Valick быстрее и проще переделать структуру базы. | |
|
|
|
|
|
|
|
для: vbps
(21.04.2012 в 12:54)
| | там делов-то создать таблицу связи, перегнать в нее значения 10-ью строчками кода и скорректировать запросы (да и то что-то мне подсказывает, что их не так много, которые относятся к этим данным) | |
|
|
|
|
|
|
|
для: 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 - как тут связей понаделать? у меня сегодня ДР и до следующего в здравом уме я, похоже, не доживу =( | |
|
|
|
|
|
|
|
для: 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,
что там за странное содержимое? | | |
|
|
|
|
|
|
|
для: Valick
(21.04.2012 в 20:54)
| | >это разные сущности? т.е. число 11 содержащееся и там и там это не одно и то же?
>полагаю что разные, но спрашиваю на всякий случай
да, конечно - это разные наборы чисел через |, просто формат одинаковый, вот по этим полям в разных случаях выборки - то есть там сервисы, темы, целевые аудитории, вот по ним и выбирают - а кто например оказывает услуги например петтинга например только мммм.... бухгалтерам? Или уход за котами и почесывание пяток только токарям и только в Коломне =)
>
>requests_end_date` int(10) unsigned NOT NULL,
>что там за странное содержимое? |
вообще там в юникстайме время, так предыдущий автор решил. на содержимое не обращай внимания, нам это несущественно сейчас, я просто чистил лишнее для примера - не то вставил, just ignore this | |
|
|
|
|
|
|
|
для: 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.")";
и так далее для оставшихся двух таблиц
____
хм.. хотел объяснить на пальцах, но что-то плохо получается, наверно надо писать готовый код
а сейчас некогда, поеду к сестре контупер лечить) | |
|
|
|
|
|
|
|
для: 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 - громоздкое, но работающее | |
|
|
|
|
|
|
|
для: kikaha
(22.04.2012 в 23:47)
| | на переделку всех, вовлеченных в эти процедуры скриптов уйдет неделя
можно вообще не переделывать, а оставить поля как есть и добавить таблицы, единственное надо будет синхронизировать информацию в полях и таблицах
и при желании переход от полей к таблицам можно растянуть лет на десять :)
___
ну раз вас устраивает предложенный результат, то так тому и быть | |
|
|
|
|