2017-12-06 1 views
0

Google Chart에서 허용하는 모델로 데이터를 구성하는 데 어려움을 겪고 있습니다. 따라서 유사한 방식으로 추출한다멀티 라인 차트 용 MySQL에서 데이터 선택

[ 
['Time',    'url1', 'url2', 'url3' ], 
['2017-12-06T12:00:00', 1,  2,  4  ], 
['2017-12-06T13:00:00', 3,  6,  5  ], 
['2017-12-06T14:00:00', 2,  5,  2  ], 
['2017-12-06T15:00:00', 7,  3,  1  ], 
] 

:

차트이 JSON() 등의 데이터를 필요로한다. 세 가지 옵션이 있습니다 - PHP/JS의 모든 데이터를 구성하거나 MySQL을 사용하여 선택한 다음 정리 만하면됩니다.

의 MySQL 데이터베이스 테이블 'ping_history'는 다음과 같습니다

|--------|-----------|-------------|---------------------| 
| ID  | url  | ping  | created_at   | 
|--------|-----------|-------------|---------------------| 
| 0  | url1  | 1   | 2017-12-06T12:00:00 | 
|--------|-----------|-------------|---------------------| 
| 1  | url2  | 2   | 2017-12-06T12:00:00 | 
|--------|-----------|-------------|---------------------| 
| 2  | url3  | 4   | 2017-12-06T12:00:10 | 
|--------|-----------|-------------|---------------------| 
| 3  | url1  | 3   | 2017-12-06T13:00:20 | 
|--------|-----------|-------------|---------------------| 
| 4  | url2  | 6   | 2017-12-06T13:00:30 | 
|--------|-----------|-------------|---------------------| 
| 5  | url3  | 5   | 2017-12-06T13:00:00 | 
|--------|-----------|-------------|---------------------| 
| 6  | url1  | 2   | 2017-12-06T14:00:40 | 
|--------|-----------|-------------|---------------------| 
| 7  | url2  | 5   | 2017-12-06T14:00:00 | 
|--------|-----------|-------------|---------------------| 
| 8  | url3  | 2   | 2017-12-06T14:00:00 | 
|--------|-----------|-------------|---------------------| 
| 9  | url1  | 7   | 2017-12-06T15:00:01 | 
|--------|-----------|-------------|---------------------| 
| 10  | url2  | 3   | 2017-12-06T15:00:02 | 
|--------|-----------|-------------|---------------------| 
| 11  | url3  | 1   | 2017-12-06T15:00:03 | 
|--------|-----------|-------------|---------------------| 

기록

가 HOUR (created_at) MAX (핑)로 선정, 핑에 의해 그룹화됩니다.

그룹화 된 URL 행을 열 제목 또는 첫 번째 행으로 표시하고 특정 URL에 대한 모든 레코드를 세로로 만들려면 ... 날짜가없는 경우 - null을 사용합니다.

어쩌면 나는이 방법이 불리는 방법을 모른다. 결과 세트 회전과 같은 것 :) 도와주세요!

+0

피벗 테이블을 검색하십시오. https://stackoverflow.com/questions/1241178/mysql-rows-to-columns –

답변

0

감사를 사용해보십시오. @ leran2002 대답은 아이템 배열을 알고있을 때 좋습니다. 제 경우에는 동적 선택을해야만했기 때문에 알려지지 않았습니다. 나는 저장 프로 시저로 끝났다. 여기있다 :

또한
CREATE DEFINER=`%`@`%` PROCEDURE `get_chart_history_pings`(IN masterId INT, IN daysLimit INT) 
BEGIN 
    SET SESSION group_concat_max_len = 1000000; 
    SELECT 
     GROUP_CONCAT(DISTINCT 
     CONCAT(
      'ifnull(MAX(case when url = ''', 
      url, 
      ''' then ping end), null) AS `', 
      url, '`' 
     ) 
    ) INTO @sql 
    FROM 
     history 
    WHERE 
     url IN (
     SELECT url FROM hosts WHERE id = masterId 
    ) 
     OR url = (SELECT url FROM masters WHERE id = masterId LIMIT 1); 

    SET @sql = CONCAT('SELECT date_format(created_at, "%Y%-%m%-%d% %H%:%i%:00") as time, ', @sql, ' 
         FROM history 
         WHERE created_at > DATE_SUB(now(), INTERVAL ',daysLimit,' DAY) 
         GROUP BY date_format(created_at, "%Y%m%d%H") 
         ORDER BY created_at ASC'); 

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

신용은 그의 대답 https://stackoverflow.com/a/28284999/2470912이 솔루션을 주도하기 때문에 @mihai 간다.

0

내가 올바른 방향으로지도하고 내가 필요 구축하는 데 성공했다 - 레디 ravinder @에 다음

SELECT 
    DATE_FORMAT(created_at, "%Y-%m-%dT%H:00:00") `Time`, 
    MAX(CASE WHEN url='url1' THEN ping END) `url1`, 
    MAX(CASE WHEN url='url2' THEN ping END) `url2`, 
    MAX(CASE WHEN url='url3' THEN ping END) `url3` 
FROM ping_history 
GROUP BY DATE_FORMAT(created_at, "%Y-%m-%dT%H:00:00") 
관련 문제