Jakoś trzeba było wygenerować informacje dla RSS

Tabela szkoleń w relacji z tabelą kategorii (wiele do wielu) oraz relacją z terminami szkoleń (jeden do wielu). Do wygenerowania X rekordów, które posiadają wszystkie kategorie i terminy danego szkolenia

Stąd taka jazda z group_concat i concat. Oczywiście jeśli szkolenie jest jednodniowe (lub nieustalone) to termin od i termin do są tym samym dniem, więc pojawia się po drodze wyłapujący to if. No i nie zapomnijmy, że terminy to typ datowy, więc dla concat musiała nastąpić konwersja typów

A to i tak jeszcze będzie w skrypcie obrabiane, bo trzeba brać poprawki na relacje pomiędzy określonymi kolumnami. Ale to już php się tym zajmie. Po co zajeżdżać bazę

A tu nieco ładniej to ujęte. Specjalnie dla Blame'a

SELECT sub.*,
group_concat(
IF( t.termin_od <> t.termin_do,
concat_ws( ' do ', cast(t.termin_od AS char), cast(t.termin_do AS char) ),
t.termin_od
)
) AS terminy
FROM (
SELECT s.id, s.nazwa, s.id_firmy, s.dodano, s.wygasa, group_concat(k.nazwa) AS kategorie
FROM szkolenia_dane s
LEFT JOIN szkolenia_kategorie_dane kd ON s.id = kd.id_ext
LEFT JOIN szkolenia_kategorie k ON kd.id_kategorii = k.id
GROUP BY s.id
) sub
LEFT JOIN szkolenia_terminy t ON sub.id = t.id_szkolenia
GROUP BY sub.id
ORDER BY sub.wygasa DESC
LIMIT 10