[MYSQL] Wynik zapytania jako nazwa kolumny

Witam, mam dość dziwny problem.

Mam tabelę test zawierająca następujące dane:

symbol sklep
1111 gdynia
1111 poznan
2222 poznan
3333 poznan
2222 warszawa

Robię zapytanie:

SELECT symbol, GROUP_CONCAT(sklep) FROM test GROUP BY symbol;

I mam wynik

symbol GROUP_CONCAT(sklep)
1111 poznan,gdynia
2222 poznan,warszawa
3333 poznan

Chciałbym to zrobić tak, żeby pokazało mi w kolumnach nazwy miast  a w wierszch ilość sztuk.

symbol | poznan | gdynia | warszawa

1111    | 1 | 1 | 0

2222    | 1 | 0 | 1

3333    | 1 | 0 | 0

Takie rzeczy to po stronie aplikacji, a nie BD.

SELECT
	s.symbol,
	SUM(CASE WHEN c.city = 'gdynia' THEN 1 ELSE 0 END) AS 'gdynia',
	SUM(CASE WHEN c.city = 'poznan' THEN 1 ELSE 0 END) AS 'poznan',
	SUM(CASE WHEN c.city = 'warszawa' THEN 1 ELSE 0 END) AS 'warszawa'
FROM
	stock AS s WITH (nolock)
	LEFT JOIN stock AS c WITH (nolock)
		ON
			s.symbol = c.symbol AND
			s.city = c.city
GROUP BY
	s.symbol
;

Cos takiego?

Miasta będą dynamiczne, może będą 3 a może 8 więc musiałoby być inaczej

To walcz dalej, osobiście wolę znać nazwy wszystkich kolumn zwracanych przez zapytanie i na dynamikę tutaj nie ma miejsca.

Na razie zrobiłem jakimiś chamskimi podzapytaniami w PHP ale chodziło mi bardziej o to czy jest taka możliwość w MySQL

 

Ale dlaczego tak? Pobierz normalnie count(*) zgrupowany po nazwie (dwie kolumny). Pivota zrób w PHP za pomocą tabeli asocjacyjnej. Jak pisałem na górze - SQL nie służy do wymyślnego formatowania danych, szkoda zasobów. Generalnie zasada jest taka, że bazę tyka się jedynie patykiem, najmniej jak można. Serwerów aplikacyjnych możesz mieć ile chcesz, bazę masz jedną.

Jeśli masz aplikację pod Windows to całkiem niezłym pomysłem jest trzymanie logiki biznesowej w bazie danych, bardzo łatwo się to modyfikuje a klient jest maksymalnie prosty.