Запрос Mysql для группировки по полям

Тема в разделе "Базы данных", создана пользователем shadowrun, 18 дек 2018.

Модераторы: latteo
  1. shadowrun

    shadowrun

    Регистр.:
    13 июл 2011
    Сообщения:
    199
    Симпатии:
    132
    Есть таблица где хранятся характеристики товара. Селект на текущий момент выводит примерно таким образом:
    Id товара // название товара // ID поля // Значение поля

    651 // Товар 1 // 579 // 38х36,5х142
    651 // Товар 1 // 549 // пластик, дерево
    651 // Товар 1 // 578 // красный
    651 // Товар 1 // 577 // 500 грамм
    652 // Товар 2 // 579 // 38х36,5х142
    652 // Товар 2 // 549 // пластик, металл

    Подскажите пожалуйста каким образом можно сгруппировать по ID товара, а значения характеристик вывести в разные колонки?
    Чтобы было примерно так:
    Id товара // название товара // field_579 // field_549 // field_578 // field_577

    651 // Товар 1 // 38х36,5х142 // пластик, дерево // красный // 500 грамм
    652 // Товар 2 // 38х36,5х142 // пластик, металл

    Если можно то пример скиньте
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.387
    Симпатии:
    2.357
    Сделать как ты хочешь можно через Join для каждого типа поля... Но это не правильно...
    Корректнее выбирать всю таблицу и проходить в цикле по полям и уже средствами PHP делать из таблицы строку.

    P.s. чисто моё мнение
     
    shadowrun нравится это.
  3. shadowrun

    shadowrun

    Регистр.:
    13 июл 2011
    Сообщения:
    199
    Симпатии:
    132
    А примерчик или хотя-бы принцип как это можно сделать на пыхе?
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.387
    Симпатии:
    2.357
    Обычный цикл while для получения значений из MySQL - стандартно.
    А внутри делаешь:

    $info[$row['field_id']] = $row['field_value'];

    В результате имеешь массив $info, где каждому ID поля соответствует его значение...
     
  5. shadowrun

    shadowrun

    Регистр.:
    13 июл 2011
    Сообщения:
    199
    Симпатии:
    132
    Спасибо буду пробовать
     
  6. newminer

    newminer Создатель

    Регистр.:
    21 апр 2015
    Сообщения:
    15
    Симпатии:
    4
    Если делать именно запросом mysql то это возможно, только если количество id поля определено
    Запрос будет содержать:
    select p.id, p.name, h1.har_id, h1.har_value, h2.har_id, h2.har_value ...
    from products p
    left join harakteristiks h1 on p.id=h1.product_id and h1.har_id=579
    left join harakteristiks h2 on p.id=h2.product_id and h2.har_id=549
    ...
     
  7. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.387
    Симпатии:
    2.357
    @newminer, не любишь ты сервера MySQL... Зачем так нагрузку увеличивать?
    Нет, технически это правильно...
    Но мой вариант позволяет выгружать только заполненные поля, рассчитан на изменение количества полей...
    Твой вариант генерирует временную таблицу + сканирует одну таблицу множество раз, что увеличивает нагрузку и время ответа...
     
    latteo нравится это.
  8. markdorcel

    markdorcel Писатель

    Регистр.:
    26 фев 2019
    Сообщения:
    3
    Симпатии:
    0
    А что у вас за движок? Схема данных явно кривая, если товаров с разнообразными модификациями миллионы то таблица будет переполнена дублирующей информацией. Я бы посоветовал миграцию на новую схему и перебрать текущие данные в ходе миграции.
     
  9. shadowrun

    shadowrun

    Регистр.:
    13 июл 2011
    Сообщения:
    199
    Симпатии:
    132
    Движок UmiCMS версия 2.9 (довольно старая). В последних версиях база уже приведена в нормальный вид
     
  10. markdorcel

    markdorcel Писатель

    Регистр.:
    26 фев 2019
    Сообщения:
    3
    Симпатии:
    0
    Ну тогда нужна только адекватная миграция, ПХП поможет, если не осилить ПХП то можно даже Ексель заюзать для такого))