-1

我有一个数据库(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 ;

现在我想向数据库询问某张照片,告诉我它有多少评论,多少评分以及平均评分是多少。

其中哪一种方法会更快:使用子查询 3 进行查询:

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 个左连接的大查询:

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
4

1 回答 1

0

用于EXPLAIN您的查询,并比较结果

于 2013-08-13T09:15:04.333 回答