SQL 计数在我的 INNER JOIN 语句中返回错误值

标签 sql database count

我是 SQL 的新手,我在使用 COUNT() 功能时遇到了一些困难。

它一直返回错误的 COUNT() 值,因为我正在尝试计算用户销售的特定汽车的 TOTAL 数量。我的表格和结果在这里: http://sqlfiddle.com/#!9/d2ef0/5

我的架构:

CREATE TABLE IF NOT EXISTS Users(
    userID INT NOT NULL AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL,
    forename VARCHAR(50) NOT NULL,
    surname VARCHAR(50) NOT NULL,
    PRIMARY KEY (userID)
);

CREATE TABLE IF NOT EXISTS CarType(
    carTypeID INT NOT NULL AUTO_INCREMENT,
    description VARCHAR(80),
    PRIMARY KEY (carTypeID)
);  

CREATE TABLE IF NOT EXISTS Country(
    countryID INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100),
    PRIMARY KEY (countryID)
);  

CREATE TABLE IF NOT EXISTS Cars(
    carID INT NOT NULL AUTO_INCREMENT,
    carTypeID INT NOT NULL,
    countryID INT NOT NULL,
    description VARCHAR(100) NOT NULL,
    make VARCHAR(100) NOT NULL,
    model VARCHAR(100),
    FOREIGN KEY (carTypeID) REFERENCES CarType(carTypeID),
    FOREIGN KEY (countryID) REFERENCES Country(countryID),
    PRIMARY KEY (carID)
);

CREATE TABLE IF NOT EXISTS Likes(
    userID INT NOT NULL,
    carID INT NOT NULL,
    likes DOUBLE NOT NULL,
    FOREIGN KEY (userID) REFERENCES Users(userID),
    FOREIGN KEY (carID) REFERENCES Cars(carID)
);

CREATE TABLE IF NOT EXISTS Sold(
    userID INT NOT NULL,
    carID INT NOT NULL,
    FOREIGN KEY (userID) REFERENCES Users(userID),
    FOREIGN KEY (carID) REFERENCES Cars(carID)
);

INSERT INTO Users VALUES 
(NULL, "micheal", "Micheal", "Sco"),
(NULL, "bensco", "Ben", "Sco"),
(NULL, "shanemill", "Shane", "Miller");

INSERT INTO CarType VALUES
(NULL, "Saloon"),
(NULL, "HatchBack"),
(NULL, "Low Rider");

INSERT INTO Country VALUES
(NULL, "UK"),
(NULL, "USA"),
(NULL, "JAPAN"),
(NULL, "GERMANY");

INSERT INTO Cars VALUES
(NULL, 1, 2, "Ford Mustang lovers", "Mustang", "Ford"),
(NULL, 2, 3, "Drift Kings", "Skyline", "Nissan"),
(NULL, 3, 1, "British classic", "Cooper", "Mini");

INSERT INTO Likes VALUES
(1, 1, 3),
(1, 2, 2),
(2, 3, 5),
(2, 3, 7),
(2, 3, 1),
(2, 3, 2);

INSERT INTO Sold VALUES
(1, 2),
(1, 3),
(1, 1),
(2, 2),
(2, 3),
(3, 1),
(3, 3);

这是Sold 表:

userID  carID
  1      2
  1      3
  1      1
  2      2
  2      3
  3      1
  3      3

这是我的复杂查询:

SELECT DISTINCT Cars.carID, Cars.description, Cars.model, Country.name, 
CarType.description, ROUND(AVG(Likes.likes)), COUNT(*)
FROM Cars
INNER JOIN Sold ON
Cars.carID = Sold.carID
INNER JOIN Country ON
Cars.countryID = Country.countryID
INNER JOIN CarType ON
Cars.carTypeID = CarType.carTypeID
INNER JOIN Likes ON
Cars.carID = Likes.carID
GROUP BY Cars.carID

这个复杂的 SQL 查询 的实际结果:

carID   description             model       name    description     ROUND(AVG(Likes.likes))     COUNT(*)
1       Ford Mustang lovers     Ford        USA     Saloon              3                           2
2       Drift Kings             Nissan      JAPAN   HatchBack           2                           2
3       British classic         Mini        UK      Low Rider           4                           12

例如,最后一个的结果不正确 - 它不应该是 12

如果有人能告诉我哪里做错了就好了

谢谢

最佳答案

您正在尝试聚合两个不同的维度——SoldLikes。结果是每辆车的行的笛卡尔积,这会影响聚合。

解决方案是预先聚合每个维度的结果:

SELECT c.carID, c.description, c.model, cy.name, ct.description,
       l.avgLikes, s.NumSold
FROM Cars c INNER JOIN
     (SELECT s.CarId, COUNT(*) as NumSold
      FROM Sold s
      GROUP BY s.CarId
     ) s
     ON c.carID = s.carID INNER JOIN
     Country cy
     ON c.countryID = cy.countryID INNER JOIN
     CarType ct
     ON c.carTypeID = ct.carTypeID LEFT JOIN
     (SELECT l.carId, AVG(Likes) as avgLikes
      FROM Likes l
      GROUP BY CarId
     ) l
     ON c.carID = l.carID;

Here是 SQL fiddle 。

关于SQL 计数在我的 INNER JOIN 语句中返回错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35690318/

相关文章:

sql - 删除SQL Server中除最高记录外的所有记录

mysql - 将 LINQ 与 SQL Server Express 2005 以外的数据库一起使用

sql - Count的两种使用方式,是等价的吗?

sql - 分别计算每列的不同值

php - 我应该将更新的计数作为用户表的一部分吗?

mysql - SQL 中日期时间的时间戳 (PHPmyAdmin)

如果所需的列值重复,则 SQL 查询获取顶部记录

SQL 内连接函数返回表

mysql - 加载逗号后空格不一致的 CSV 文件

database - 如何在数据库中模拟打开/关闭状态?