mysql - 这个查询如何正确
问题描述
我有3张这样的桌子。对于我的作业,我必须进行一个查询,即选择一个 DVD 名称、DVD 类别和至少被两个客户批评的平均费率
CREATE TABLE dvd(
`dvdId` INT NOT NULL,
`Name` VARCHAR(45) NULL,
`Category` VARCHAR(45) NULL,
`Price` INT NOT NULL,
PRIMARY KEY (`Id`));
CREATE TABLE Subtitles(
`dvdId` INT NOT NULL,
`Language` VARCHAR(45) NULL);
CREATE TABLE critic(
`dvdId` INT NOT NULL,
`customerName` VARCHAR(45) NULL,
`rate` INT NOT NULL,
`comment` VARCHAR(45) NULL);
我正在尝试执行此操作,但此查询无法按我的意愿工作。谁能帮我?
SELECT name,catergory, avg(rate) as rate FROM Dvd INNER JOIN Critic ON
Dvd.dvdId=Critic.DvdId
GROUP BY customerName
HAVING COUNT(*) >2;
解决方案
试试下面的脚本 -
GROUP BY 的基础是,您必须对您在查询的 SELECT 部分中选择的所有非聚合列进行 GROUP BY。在您的查询中,您已选择名称和类别列作为非聚合列,但未将它们正确添加到 GROUP BY 中。
SELECT name,Category, -- you have wrong column name "Category" in your query
avg(rate) as rate
FROM Dvd
INNER JOIN Critic
ON Dvd.dvdId=Critic.DvdId
GROUP BY name,Category
-- Add all non aggregated columns in the GROUP BY from the SELECT part
HAVING COUNT(*) >2;
注意:如果需要值,您还可以在 SELECTION 和 GROUP BY 部分中添加列“customerName”。但请记住,在 GROUP BY 中添加新列意味着在输出中创建新维度/组。所以你必须小心在 GROUP BY 中添加列。
推荐阅读
- php - 结合一些php子数组,有条件
- ping - 如何为服务器中的辅助 IP 执行 Nagios check_ping?
- google-bigquery - Airflow:将 BigQuery 结果作为 XCom 传递的最佳方式
- python - 使用 DatetimeIndex 重新采样 DataFrame 并保持日期范围
- amazon-web-services - 是否可以在 EC2 上运行 docker?
- ruby-on-rails - 如何在 Rails 中同时使用 form_with 和 simple_form_for?
- javascript - 刷新 currentsong 广播
- python - Python 是否支持等距照片?
- outlook - Outlook 邮件正文仅返回最近的邮件
- docker - 当我在 Ubuntu 16.04 上下载大文件 (40GB) 时,Docker 构建崩溃