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

时间:2016-02-29 00:53:26

标签: sql database count

我对SQL很陌生,我的Collections.sort(myStringList, Collections.reverseOrder(myComparator))功能遇到了一些困难。

当我尝试计算用户销售的特定汽车的COUNT()数量时,它会一直返回错误的COUNT()值。我的表格和结果如下: http://sqlfiddle.com/#!9/d2ef0/5

我的架构:

TOTAL

这是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 Query

例如,最后一个的结果不正确 - 它不应该是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

如果有人能告诉我哪里出错了会很好

由于

2 个答案:

答案 0 :(得分:2)

您正尝试跨两个不同的维度进行汇总 - 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小提琴。

答案 1 :(得分:0)

如果你想要的只是用户销售的特定汽车的总数,那么你所有的信息都在售出的表中。此查询将为您提供carID所需的内容。如果要加入其他表以获取更多信息,可以将其用作子查询。

SELECT userID, carID, count(*) as totalSold FROM Sold GROUP BY userID, carID;