2013-08-13 2 views
-1

사진, 등급 (사람들이 투표 할 수 있음) 및 의견에 대한 정보가 들어있는 데이터베이스 (MySQL)가 있습니다. 그것이 얼마나 많은 등급을 가지고 있으며, 무엇 평균 평가 점수는 얼마나 많은 의견MySQL - 어떤 쿼리가 더 빠를 것입니까?

CREATE TABLE IF NOT EXISTS `Photos` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Description` NVARCHAR(2000), 
    `Author` INT, 
    `Contest` INT, 
    `PhoneModel` NVARCHAR(200), 
    `PhotoThumbPath` NVARCHAR(2000), 
    `PhotoPath` NVARCHAR(2000), 
    `Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `State` INT DEFAULT 1, 
    FOREIGN KEY (`Author`) REFERENCES `Users`(`ID`), 
    FOREIGN KEY (`Contest`) REFERENCES `Contests`(`ID`), 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `PhotoComments` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Author` INT, 
    `Photo` INT, 
    `Comment` NVARCHAR(2000), 
    `Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `ReplyTo` INT, 
    FOREIGN KEY (`Author`) REFERENCES `Users`(`ID`), 
    FOREIGN KEY (`Photo`) REFERENCES `Contests`(`ID`), 
    FOREIGN KEY (`ReplyTo`) REFERENCES `PhotoComments`(`ID`), 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

CREATE TABLE IF NOT EXISTS `PhotoComments` (
    `ID` INT NOT NULL AUTO_INCREMENT, 
    `Author` INT, 
    `Photo` INT, 
    `Comment` NVARCHAR(2000), 
    `Date` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    `ReplyTo` INT, 
    FOREIGN KEY (`Author`) REFERENCES `Users`(`ID`), 
    FOREIGN KEY (`Photo`) REFERENCES `Contests`(`ID`), 
    FOREIGN KEY (`ReplyTo`) REFERENCES `PhotoComments`(`ID`), 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

은 지금은 저를주기 위해 certaing 사진에 대한 데이터베이스를 물어보고 싶은. 빠른 것 그 방법

어느 하나를 하위 쿼리 3 쿼리 : 당신의 querys에

SELECT P.PhotoPath, P.Date, P.PhoneModel, 
COUNT(DISTINCT C.ID) as CommentsCount, 
COUNT(DISTINCT R.ID) as RatingsCount, 
COALESCE(AVG(R.Rating), 0) as RatingsAvg 
FROM Photos P 
LEFT JOIN PhotoComments C ON C.Photo=P.ID 
LEFT JOIN PhotoRatings R ON R.Photo=P.ID 
WHERE P.ID=$photoID 
GROUP BY P.ID 

답변

0

사용 EXPLAIN, 그리고 비교 :

SELECT P.PhotoPath, P.Date, P.PhoneModel, 
(SELECT COUNT(1) FROM PhotoComments C where C.Photo=P.ID) as CommentsCount, 
(SELECT COUNT(1) FROM PhotoRatings R where R.Photo=P.ID) as RatingsCount, 
(SELECT COALESCE(AVG(Rating), 0) FROM PhotoRatings R where R.Photo=P.ID) as RatingsAvg 
FROM Photos WHERE P.ID=$photoID 

2 왼쪽에 하나 개의 큰 쿼리는 조인 결과는

입니다.
관련 문제