MySQL - запрос объединяет строки с одинаковым идентификатором и сохраняет все записи для этого идентификатора, но как одну запись

Я работаю над таблицей в базе данных mysql, которая хранится локально на сервере wamp. Я использую область phpmyadmin с wamp для запуска запросов. Я пытаюсь получить данные, чтобы сделать следующее:

Может ли кто-нибудь помочь, у меня есть таблица с количеством записей для растений. У растения может быть несколько названий, таблица показывает это как разные записи. Таблица называется new_plantsname

plantid name
1       tree
1       rose
2       bush
3       tree
3       bush
3       rose

это продолжается более 3000 записей

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

plantid name1 name2 name3 ...
1       tree  rose  NULL
2       shrub NULL  NULL
3       tree  rose  bush 

так далее

С первого взгляда я считаю, что у растения не более 4 названий.

Может ли кто-нибудь помочь мне с запросом, чтобы сделать это. Я также хочу сохранить результаты в новую таблицу

Кто-то дал мне следующее для ответа:

select plantid,
  max(case when nameRn = 'name1' then name end) Name1,
  max(case when nameRn = 'name2' then name end) Name2,
  max(case when nameRn = 'name3' then name end) Name3,
  max(case when nameRn = 'name4' then name end) Name4
from
(
  select plantid, name,
      concat('name', @num := if(@plantid = `plantid`, @num + 1, 1)) as nameRn,
      @plantid := `plantid` as dummy
  from
  (
    select plantid, name, @rn:=@rn+1 overall_row_num
    from yourtable, (SELECT @rn:=0) r
  ) x
  order by plantid, overall_row_num
) src
group by plantid;

Кажется, это работает без ошибок, но не объединяет записи, а сохраняет только имя первой записи с идентификатором, а не остальные. ИСПОЛЬЗУЕМЫЕ ДАННЫЕ:

plantid     name
    1       tree
    1       rose
    2       tree
    3       rose
    3       bush
    3       rose

РЕЗУЛЬТАТЫ:

результаты показывают нуль, добавленный для всех, кроме имени

Может ли кто-нибудь помочь


person zaratjlc    schedule 16.11.2012    source источник
comment
Да, нет, здесь это работает, но когда я запускаю его в phpmyadmin wamp, он не дает такого результата, он дает мне только первое имя и ставит нуль для остальных   -  person zaratjlc    schedule 17.11.2012
comment
Я бы предположил, что у вас нет той же структуры данных, о которой вы говорите здесь. В результате я думаю, что вам решать следующий этап. Приведенный ранее пример явно работает в приведенной выше демонстрации. В противном случае, возможно, phpmyadmin не сможет правильно обработать запрос. Вы пытались запустить запрос в другом инструменте администратора???   -  person Phill Healey    schedule 17.11.2012


Ответы (1)


Проблема в том, что MySQL не имеет хорошего способа перечисления строк. Использование константы не гарантирует работу, увы, согласно документации MySQL. Часто это работает, но также может быть проблематично.

Я бы посоветовал вам объединить имена в одно поле. Результат будет выглядеть так:

1     tree,rose
2     tree
3     tree,bush,rose

Использование SQL:

select plantid, group_concat(name separator ',')
from t
group by plantid

Если вам действительно нужны имена в отдельных столбцах, на ум приходят два варианта. Один из них — использовать результаты, полученные выше, а затем разбивать результат на отдельные строки. Другой альтернативой является использование самообъединения и агрегации для вычисления порядкового номера, например:

select p.plantid, p.name, count(*) as seqnum
from t p left outer join
     t pprev
     on p.plantid = pprev.plantid and
        p.name >= pprev.name
group by p.plantid, p.name

И используйте это как подзапрос.

person Gordon Linoff    schedule 16.11.2012