здравствуйте! есть таблица table и есть таблица-справочник reference соотв. этому id...приблизительно вот так: table id | name 1 | 1, 2 reference id | code | second 1 | 1 | tratata 1 | 2 | trutata вопрос - в принципе возможно ли создать возможностями MySql итоговую строку, которая будет такой: id | name 1 | tratata @ trutata ? поле name varchar... почему спрашиваю... есть очень много строк в первой таблице и средствами php и Mysql вопрос решается, но длительность отработки свыше 2 часов... заранее спасибо за помощь!
в том-то и дело... данные приходят со сторонней организации и никто там ничего переделывать не станет... в поле name есть два случая, когда один символ и когда два, через запятую... сейчас я поле с двумя символами разбиваю на два и делаю запрос в справочник по обоим потом в php объединяю и делаю update поля в основной таблице... оно ну очень долго работает! вот и спрашиваю - в принципе возможно в sql как-то исхитрится?
Напиши большей деталей. Кол-во данных. Скинь сюда уже готовую структуру, возможно при наличии свободного времени потестирую. Если доступ к API бесплатный или требует простой регистрации, тоже кидай.
структура ровно такая, какую я в шапке накидал... алгоритм такой - я забираю с сфтп несколько файлов, потом их распарсиваю и закидываю в итоговую таблицу для общего пользования... все поля (кроме name), если есть соответствие, легко объединяются join-ом, а вот с name - проблема, там может быть или один символ, или два через запятую... собственно вопрос-то и задавался о принципиальной возможности - можно или нельзя организовать concat в таком случае...
Добрый день! Вы импортируете данные и в них name может содержать одно или несколько значений через запятую. Эту структуру данных специально для Вас никто менять не будет, согласен, но Вы можете сохранять данные в БД, так как захотите, например, name = "1,2" вместо: могли бы сохранять так: а для общего пользования, по запросам, можете показывать name как удобно. Удачи!
мне так не подходит - у одного ид должна быть в итоге только одна запись... единственное, что на сейчас приходит в голову - сделать темповую таблицу, слить в неё все данные через IN(1, 2), а потом на эту таблицу напустить GROUP_CONCAT с группировкой по ид... по любому, это будет быстрее, чем делать UPDATE на поле name...
PHP: CREATE TABLE `table` ( `ind` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, `id` int(11) NOT NULL, `name` int(11) NOT NULL );
у меня на итоговой таблице поле id уже PRIMARY KEY... всё равно по всей видимости не получится... делать JOIN на двух таблицах по полю, которое содержит одно или два значения без дополнительной проставки не реально! проставка в виде php съедает львиную долю времени... Код (Text): function codes($id, $name){ if($name != '') { $q = sql_query($connbo, "select * from bo.R_PEP_019 where k019 in ($name)"); while ($i = sql_fetch_array($q)) { $type[] = $i['type']; } $all = addslashes(implode('@', $type)); }else{ $all = ''; } } вот эта проставка и она отрабатывает около часа времени... в принципе, если запускать до начала рабочего времени, то час это не так много...
Добрый день! Вот у Вас и выстрелило... Если запросы работают медлено, начинать решать проблему нужно с оптимизации структуры данных. Причём, в Вашем случае ошибка очевидна. Воспользуйтесь моим советом, только удалите PRIMARY KEY из поля id. Удачи!
короче - решил! в несколько приёмов, но время теперь занимает около 10мин.! разбил поле code на два поля, потом с каждым сделал JOIN со справочником, а потом сделал CONCAT с значениями... всё отлично!
Благая весть. Правильно ли я понял, что речь идёт клиентском запросе? Песочные часы на экране 10 минут весят?
у меня бэковая сторона... всё выполняется в консольке... просто посчитал общее время выполнения! клиенту отдаётся только итоговая, заполненная табличка, а что он с ней там уже делает - меня не волнует ! с моей стороны нужен был только регламент по созданию итоговой таблички раз в сутки!