2016-07-26 2 views
1

열을 행을 가져 오는 mySQL 쿼리를 만들려고 해요, 내가 가장 가까운 결과를 얻을 수 있지만 아직 필요한 것은 아니며 이미 그것에 많은 시간을 보냈다 알아낼 수 없습니다. 내가 뭘 놓쳤는 지.동적으로 열을 MySQL로

|id|CPU1          |CPU2         |CPU3        | 
|10|Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz |NULL         |NULL        | 
|11|NULL          |Intel(R) Xeon(R) CPU E5530 @ 2.40GHz |Intel(R) Xeon(R) CPU E5530 @ 2.40GHz| 

내가 달성해야 할 결과는 다음과 같습니다 :

SET SESSION group_concat_max_len = 1000000; 

SET @sql = NULL; 

SET @rank=0; 

SELECT 
    GROUP_CONCAT(
    CONCAT(
     'MAX(CASE WHEN cpus.hardware_id= ''', 
     cpus.hardware_id, 
     ''' THEN cpus.type END) AS CPU',@rank:[email protected]+1 
      ) 
    )INTO @sql 
FROM 
    hardware 
LEFT JOIN cpus ON hardware.id = cpus.hardware_id; 


SET @sql=CONCAT('SELECT hardware.id, ',@sql,' FROM 
    hardware 
    JOIN cpus ON hardware.id = cpus.hardware_id GROUP BY hardware.id'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

이 쿼리의 결과는 내가 여러 CPU를 가질 수 있기 때문에

|id|CPU1          |CPU2         | 
|10|Intel(R) Xeon(R) CPU E5-2407 0 @ 2.20GHz |NULL         | 
|11|Intel(R) Xeon(R) CPU E5530 @ 2.40GHz  |Intel(R) Xeon(R) CPU E5530 @ 2.40GHz | 

쿼리 동적 할 필요가 각 하드웨어에 대해

SQL Fiddle

이에 어떤 도움이 정말 감사합니다. 미리 감사드립니다.

답변

0

동적 SQL이 필요한지 궁금합니다. 두 개의 열이 필요하면 다음을 수행 할 수 있습니다.

select cpus.hardware_id as id, min(cpus.type) as cpu1, 
     (case when min(cpus.type) <> max(cpus.type) then max(cpus.type) end) as cpu2 
from cpus 
group by cpus.hardware_id; 
+1

많은 행을 CPU로 가질 수 있기 때문에 동적이 필요합니다. 각 하드웨어 장치에 따라 다릅니다. 이 샘플 데이터의 경우 최대 CPU는 2이지만 더 많은 CPU가있는 다른 하드웨어가 있으면 쿼리에서 모두 반환해야합니다. – vandyk

0

피벗 쿼리 질문이 싫어. 난 정말 당신이 SQL 에서이 문제를 해결하려고 어떤 이점을 얻지 않는다고 생각하지 않습니다. 내 말은, SQL은 실제로 구조화 된 데이터를위한 언어입니다. 당신은 단지 ID와 여러 CPU 필드를 원하는 경우 특히 :

은 왜 어쨌든 이러한 CPU를 통해 아마 사이클, 나는 의심한다 소프트웨어 측면에있는 어떤 코드

id | number | CPU 
---+--------+----------------------------- 
1 |  1 | first cpu description 
1 |  2 | second cpu description 
1 | ... | ... 
2 |  1 | ... 

내 말을 가져 오지. 이제 소프트웨어 측면에서 ID가 동일하면 CPU를 수집 할 수 있습니다.

또는 mysql에서 group_concat을 cpu 필드에 나타나지 않는 일부 구분 기호로 사용하거나 새 json 함수 중 하나를 사용할 수 있습니다. (예, 나는 그 쿼리에 집착하는 데 익숙해졌습니다. 더 간단합니다.)

관련 문제