mysql - 根据 resultID 创建违规发生频率的列表

标签 mysql join sum aggregate-functions

我正在尝试根据我的“违规”表和“结果”表之间的关系创建违规列表以及违规发生的频率。

两者的关系是resultID列是'result'表的主键,result_resultID列是'violation'表的外键。

我试图按 violationID 对它们进行分组,我需要某些结果发生次数的总和。

我的数据库架构脚本如下:

-- MySQL Workbench 正向工程

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- Schema jocutraffic


-- Table `offender`

DROP TABLE IF EXISTS `offender` ;

CREATE TABLE IF NOT EXISTS `offender` (
`offenderID` INT NOT NULL,
`firstname` VARCHAR(45) NULL,
`lastname` VARCHAR(45) NULL,
`address` VARCHAR(45) NULL,
`city` VARCHAR(45) NULL,
`state` VARCHAR(2) NULL,
`numberoftickets` INT NULL DEFAULT NULL,
PRIMARY KEY (`offenderID`),
UNIQUE INDEX `offenderID_UNIQUE` (`offenderID` ASC))
ENGINE = InnoDB;

-- Table `vehicle`

DROP TABLE IF EXISTS `vehicle` ;

CREATE TABLE IF NOT EXISTS `vehicle` (
`vehicleLiscense` VARCHAR(35) NOT NULL,
`state` VARCHAR(2) NOT NULL,
`color` VARCHAR(45) NULL,
`year` YEAR NULL DEFAULT NULL,
`make` VARCHAR(45) NULL DEFAULT NULL,
`type` VARCHAR(45) NULL DEFAULT NULL,
`vin` VARCHAR(45) NULL DEFAULT NULL,
`owner` VARCHAR(45) NULL DEFAULT NULL,
`address` VARCHAR(45) NULL,
`offenderID` INT(11) NOT NULL,
PRIMARY KEY (`vehicleLiscense`, `offenderID`),
INDEX `fk_vehicle_offender_idx` (`offenderID` ASC),
CONSTRAINT `fk_vehicle_offender`
FOREIGN KEY (`offenderID`)
REFERENCES `offender` (`offenderID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- Table `result`

DROP TABLE IF EXISTS `result` ;

CREATE TABLE IF NOT EXISTS `result` (
`resultID` INT NOT NULL,
`description` VARCHAR(250) NOT NULL,
PRIMARY KEY (`resultID`))
ENGINE = InnoDB;

-- Table `officer`

DROP TABLE IF EXISTS `officer` ;

CREATE TABLE IF NOT EXISTS `officer` (
`officerID` INT NOT NULL,
`firstname` VARCHAR(45) NULL,
`lastname` VARCHAR(45) NULL,
PRIMARY KEY (`officerID`),
UNIQUE INDEX `lastname_UNIQUE` (`lastname` ASC))
ENGINE = InnoDB;

-- Table `violation`

DROP TABLE IF EXISTS `violation` ;

CREATE TABLE IF NOT EXISTS `violation` (
`violationID` INT NOT NULL,
`vehicle_vehicleLiscense` VARCHAR(35) NOT NULL,
`offenderID` INT(11) NOT NULL,
`violationMonth` INT(2) NOT NULL,
`violationDay` VARCHAR(2) NOT NULL,
`violationYear` YEAR NOT NULL,
`result_resultID` INT NOT NULL,
`officer_officerID` INT NOT NULL,
PRIMARY KEY (`violationID`, `vehicle_vehicleLiscense`, `offenderID`),
INDEX `fk_violation_vehicle1_idx` (`vehicle_vehicleLiscense` ASC, `offenderID` ASC),
INDEX `fk_violation_result1_idx` (`result_resultID` ASC),
INDEX `fk_violation_officer1_idx` (`officer_officerID` ASC),
UNIQUE INDEX `violationID_UNIQUE` (`violationID` ASC),
CONSTRAINT `fk_violation_vehicle1`
FOREIGN KEY (`vehicle_vehicleLiscense` , `offenderID`)
REFERENCES `vehicle` (`vehicleLiscense` , `offenderID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_violation_result1`
FOREIGN KEY (`result_resultID`)
REFERENCES `result` (`resultID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_violation_officer1`
FOREIGN KEY (`officer_officerID`)
REFERENCES `officer` (`officerID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

下面是一些我插入到表格中的数据截图,以加深理解。

enter image description here enter image description here

我知道我可能需要一个 join 语句,但是我在使用聚合 SUM 函数时遇到了问题。非常感谢任何帮助

最佳答案

这会给你每个结果的总和,你不需要 vehicule 连接来获得结果,但我离开以防你的问题不同。

SQL Fiddle Demo

SELECT re.`description`, count(*)
FROM `violation` vi
JOIN `vehicle` ve
  ON vi.`vehicle_vehicleLiscense` = ve.`vehicleLiscense`
 AND vi.`offenderID` = ve.`offenderID`
JOIN `result` re
  ON vi.`result_resultID` = re.`resultID`
GROUP BY re.`description`

关于mysql - 根据 resultID 创建违规发生频率的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34008634/

相关文章:

mysql - DOUBLE(n, 0) 和 BIGINT(in) MySQL 数据类型之间有什么区别吗?

python - Django迁移: all the columns are not generated as the model

MYSQL::从没有最新行的表中选择行

ruby-on-rails - 如何在不使用包含的情况下避免 n + 1?

sql - 具有 GROUP BY 和聚合函数的多个 INNER JOIN

mysql - 使用 SQL 检查时间戳是否是今天

php - Yii2:使用 Query 与 ActiveRecord 构建复杂查询

mysql - 困难的查询 - 非常接近但还没有完全实现

mysql - 为什么 mysql sum 在 mysql 查看表中不起作用?

mysql - 聚合 MySQL 函数总是返回一行吗?