이 문제를 처리하는 몇 가지 질문을 발견했으며 MySQL은이를 허용하지 않습니다. 괜찮아요, 난 FROM 절에 하위 쿼리가 있어야하지 않습니다. 그러나 나는 그걸 해결하는 방법을 모른다. 여기에 내 설치가 :FROM 절의 SQL 하위 쿼리
내가 원하는 3 개의 열이있는 메트릭스 테이블이 있습니다 : ControllerID, TimeStamp 및 State. 기본적으로 데이터 수집 엔진은 5 분마다 데이터베이스의 각 컨트롤러에 연결하고 메트릭 테이블에 항목을 저장합니다. 표에는이 세 개의 열과 MetricID가 포함되어 있습니다. 어쩌면 그 통계를 저장하는 더 좋은 방법이 있을지 모르지만 나는 그것을 모른다. 상관없이 각기 다른 ControllerID에 대해 가장 최근의 TimeStamp를 가져 와서 TimeStamp, ControllerID 및 State를 가져 오는보기가 필요합니다. 따라서 4 개의 컨트롤러가있는 경우보기에는 항상 가장 최근의 상태와 함께 다른 컨트롤러가있는 4 개의 행이 있어야합니다.
나는 원하는 것을 얻는 쿼리를 만들 수 있었지만 FROM 절의 하위 쿼리에 의존합니다. 뷰에서 허용되지 않는 쿼리입니다. 여기 내가 지금까지 가지고있는 것입니다 :
SELECT *
FROM
(SELECT
ControllerID, TimeStamp, State
FROM Metrics
ORDER BY TimeStamp DESC)
AS t
GROUP BY ControllerID;
내가 말했듯이,이 훌륭한 작품. 하지만 나는 그것을보기에 사용할 수 없다. max() 함수를 사용해 보았습니다. 그러나 여기서는 다음과 같습니다. SQL: Any straightforward way to order results FIRST, THEN group by another column? GROUP BY 및 ORDER BY 열 외에 추가 열을 원하면 max()가 작동하지 않습니다. 이 제한 사항을 확인했지만 작동하지 않습니다.
또한 타임 스탬프로 주문하기 위해 메트릭 테이블을 변경하려고했습니다. 그것도 작동하지 않습니다; 잘못된 행이 유지됩니다.
편집 : 여기에서 당겨 오전 메트릭 테이블의 SHOW CREATE TABLE
입니다 :
CREATE TABLE Metrics (
MetricsID int(11) NOT NULL AUTO_INCREMENT,
ControllerID int(11) NOT NULL,
TimeStamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
State tinyint(4) NOT NULL,
PRIMARY KEY (MetricsID),
KEY makeItFast (ControllerID,MetricsID),
KEY fast (ControllerID,TimeStamp),
KEY fast2 (MetricsID),
KEY MetricsID (MetricsID),
KEY TimeStamp (TimeStamp)
) ENGINE=InnoDB AUTO_INCREMENT=8958 DEFAULT CHARSET=latin1
쿼리에서 새 테이블을 만들고 트리거를 추가하여 필요한 간격으로 업데이트를 유지하고보기에서 사용합니다. – Mihai
불행히도 참조 된 대답은 분명히 문서화 된 MySQL 확장을 사용하기 때문에 올바르지 않습니다. 쿼리가 작동하는 데 필요한 결과를 반환하지 않으려면 http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html을 참조하십시오. –
예, 이것은 MySQL의 (이상한) 제한 사항 중 하나입니다. 뷰에 파생 테이블을 사용할 수 없습니다. 파생 테이블을 사용하지 않으려면 명령문을 다시 작성해야합니다. –