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:[email protected]+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
Результаты:
![results show null added for all except first name]()
Может ли кто-нибудь помочь
Ответы
Ответ 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
И используйте это как подзапрос.