За последние 24 часа нас посетили 35037 программистов и 1756 роботов. Сейчас ищут 779 программистов ...

возможно ли организовать group concat

Тема в разделе "MySQL", создана пользователем l_2001, 12 май 2024.

  1. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    здравствуйте!
    есть таблица 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 часов...
    заранее спасибо за помощь!
     
  2. Дюран

    Дюран Активный пользователь

    С нами с:
    9 мар 2018
    Сообщения:
    291
    Симпатии:
    21
    Это что, в первой таблице, в поле name через запятую хранятся id-шки из таблицы reference?
     
  3. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    в том-то и дело... данные приходят со сторонней организации и никто там ничего переделывать не станет... в поле name есть два случая, когда один символ и когда два, через запятую... сейчас я поле с двумя символами разбиваю на два и делаю запрос в справочник по обоим потом в php объединяю и делаю update поля в основной таблице... оно ну очень долго работает! вот и спрашиваю - в принципе возможно в sql как-то исхитрится?
     
  4. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    То есть, у кого-то есть доступ к вашей базе?
    Или, всё-таки, речь о каком-то импорте?
     
  5. Survivor

    Survivor Новичок

    С нами с:
    8 фев 2023
    Сообщения:
    93
    Симпатии:
    19
    Напиши большей деталей. Кол-во данных. Скинь сюда уже готовую структуру, возможно при наличии свободного времени потестирую.
    Если доступ к API бесплатный или требует простой регистрации, тоже кидай.
     
  6. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    структура ровно такая, какую я в шапке накидал... алгоритм такой - я забираю с сфтп несколько файлов, потом их распарсиваю и закидываю в итоговую таблицу для общего пользования... все поля (кроме name), если есть соответствие, легко объединяются join-ом, а вот с name - проблема, там может быть или один символ, или два через запятую... собственно вопрос-то и задавался о принципиальной возможности - можно или нельзя организовать concat в таком случае...
     
  7. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Добрый день!
    Вы импортируете данные и в них name может содержать одно или несколько значений через запятую.
    Эту структуру данных специально для Вас никто менять не будет, согласен, но Вы можете сохранять данные в БД,
    так как захотите, например, name = "1,2" вместо:
    могли бы сохранять так:
    а для общего пользования, по запросам, можете показывать name как удобно.

    Удачи!
     
  8. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    мне так не подходит - у одного ид должна быть в итоге только одна запись... единственное, что на сейчас приходит в голову - сделать темповую таблицу, слить в неё все данные через IN(1, 2), а потом на эту таблицу напустить GROUP_CONCAT с группировкой по ид... по любому, это будет быстрее, чем делать UPDATE на поле name...
     
  9. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Вам нужно в таблицу добавить первое поле, например, `ind` PRIMARY KEY, AI
     
    #9 Vladimir Kheifets, 15 май 2024
    Последнее редактирование: 15 май 2024
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    PHP:
    1. CREATE TABLE `table` (
    2. `ind` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    3. `id` int(11) NOT NULL,
    4. `name` int(11) NOT NULL );
     
  11. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    у меня на итоговой таблице поле id уже PRIMARY KEY... всё равно по всей видимости не получится... делать JOIN на двух таблицах по полю, которое содержит одно или два значения без дополнительной проставки не реально! проставка в виде php съедает львиную долю времени...
    Код (Text):
    1. function codes($id, $name){
    2.     if($name != '') {
    3.         $q = sql_query($connbo, "select * from bo.R_PEP_019 where k019 in ($name)");
    4.         while ($i = sql_fetch_array($q)) {
    5.             $type[] = $i['type'];
    6.         }
    7.         $all = addslashes(implode('@', $type));
    8.     }else{
    9.         $all = '';
    10.     }
    11. }
    вот эта проставка и она отрабатывает около часа времени... в принципе, если запускать до начала рабочего времени, то час это не так много...
     
  12. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Добрый день!
    Вот у Вас и выстрелило...
    Если запросы работают медлено, начинать решать проблему нужно с оптимизации структуры данных.
    Причём, в Вашем случае ошибка очевидна.
    Воспользуйтесь моим советом, только удалите PRIMARY KEY из поля id.
    Удачи!
     
  13. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    короче - решил! в несколько приёмов, но время теперь занимает около 10мин.! разбил поле code на два поля, потом с каждым сделал JOIN со справочником, а потом сделал CONCAT с значениями... всё отлично!
     
  14. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    485
    Симпатии:
    95
    Адрес:
    Бавария, Германия
    Благая весть. Правильно ли я понял, что речь идёт клиентском запросе? Песочные часы на экране 10 минут весят?
     
  15. l_2001

    l_2001 Активный пользователь

    С нами с:
    9 дек 2014
    Сообщения:
    85
    Симпатии:
    3
    у меня бэковая сторона... всё выполняется в консольке... просто посчитал общее время выполнения! клиенту отдаётся только итоговая, заполненная табличка, а что он с ней там уже делает - меня не волнует :) ! с моей стороны нужен был только регламент по созданию итоговой таблички раз в сутки!