MySQL: 동적 행 값을 열 이름으로 사용
질문:
가변 열 이름이 있는 이전 테이블을 고정 열 이름이 있는 테이블로 변환하는 MySQL 쿼리를 작성하는 방법은 무엇입니까? 여기서 특정 열의 각 고유 행 값은 열 이름이 됩니다.
배경:
다음 구조의 테이블을 생각해 보세요.
<code>id name value ------------------------------ 0 timezone Europe/London 0 language en 0 country 45 0 something x 1 timezone Europe/Paris 1 language fr 1 country 46</code>
요구사항:
표를 다음 형식으로 변환하세요.
<code>id timezone language country something --------------------------------------------------- 0 Europe/London en 45 x 1 Europe/Paris fr 46</code>
MySQL은 기본 피벗 작업을 지원하지 않으므로 해결 방법을 찾아야 합니다.
해결책:
GROUP_CONCAT()
함수를 사용하면 원하는 테이블 형식을 생성하는 쿼리를 동적으로 생성할 수 있습니다. GROUP_CONCAT()
을 사용하여 최종 쿼리를 작성하는 문자열을 준비합니다. PREPARE
및 EXECUTE
을 사용하여 동적으로 생성된 쿼리를 실행합니다. 쿼리:
<code class="language-sql">SELECT CONCAT( 'SELECT `table`.id', GROUP_CONCAT(' , `t_', REPLACE(name, '`', '``'), '`.value AS `', REPLACE(name, '`', '``'), '`' SEPARATOR ''), ' FROM `table` ', GROUP_CONCAT(' LEFT JOIN `table` AS `t_', REPLACE(name, '`', '``'), '` ON `table`.id = `t_', REPLACE(name, '`', '``'), '`.id AND `t_', REPLACE(name, '`', '``'), '`.name = ', QUOTE(name) SEPARATOR ''), ' GROUP BY `table`.id' ) INTO @qry FROM (SELECT DISTINCT name FROM `table`) t; PREPARE stmt FROM @qry; EXECUTE stmt;</code>
참고:
GROUP_CONCAT()
결과 길이는 group_concat_max_len
변수에 의해 제한됩니다(기본값은 1024바이트). CASE WHEN
또는 여러 하위 선택/조인이 포함된 준비된 문을 사용할 수 있지만 이를 위해서는 고유한 열 값을 수동으로 처리해야 합니다. 위 내용은 행 값에서 동적 열 이름을 사용하여 MySQL 테이블을 피벗하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!