Problem polega na tym, że MySQL nie ma dobrego sposobu na wyliczanie wierszy. Użycie stałej nie gwarantuje działania, niestety, zgodnie z dokumentacją MySQL. Często działa, ale może być również problematyczny.
Sugerowałbym połączenie nazw w jedno pole. Wynik wyglądałby tak:
1 tree,rose
2 tree
3 tree,bush,rose
Korzystanie z SQL:
select plantid, group_concat(name separator ',')
from t
group by plantid
Jeśli naprawdę chcesz, aby nazwy były umieszczone w osobnych kolumnach, przychodzą mi do głowy dwie opcje. Jednym z nich jest użycie wyników z góry, a następnie przetworzenie wyniku na oddzielne ciągi. Inną alternatywą jest użycie samopołączenia i agregacji do obliczenia numeru sekwencyjnego, na przykład:
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
Użyj tego jako podzapytania.