簡體   English   中英

SQL計數在我的INNER JOIN語句中返回錯誤的值

[英]SQL Count returns wrong value in my INNER JOIN Statement

我對SQL還是很陌生,並且在使用COUNT()功能時遇到了一些困難。

當我試圖計算用戶出售的特定汽車的TOTAL時,它一直返回錯誤的COUNT()值。 我的表格和結果在這里: 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 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

例如,最后一個的結果不正確-不應為12

如果有人能告訴我我哪里出問題了,那會很好

謝謝

您試圖跨兩個不同維度進行匯總- Sold和點Likes 結果是每個汽車的行的笛卡爾積,這將引發聚合。

解決方案是預先匯總各個維度上的結果:

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;

是SQL Fiddle。

如果您想要的只是用戶出售的特定汽車的總數,那么您的所有信息都在已出售的表格中。 該查詢將通過carID給您您想要的東西。 如果要加入其他表以獲取更多信息,可以將其用作子查詢。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM