2014-01-13 75 views
0

我有兩個表格,一個叫做遊戲,一個叫做評論。SQL內部加入計數

我想加入這兩個表在一起,並已通過文件和其他問題在這裏查看stackoverflow。

SELECT games.id, games.title, games.developer, reviews.review, reviews.review_title, 
(SELECT review, COUNT(*) 
FROM reviews 
GROUP BY review) AS Numberofreviews 
FROM games 
INNER JOIN reviews 
ON games.ean=reviews.games_ean; 

查詢,我想要做的是得到一個表,顯示遊戲列表和每個遊戲已收到多少評論。

但是當我嘗試執行上面的代碼中,我得到了錯誤的操作數應包含一列

伊夫看着其他人得到這個錯誤,但不是在同樣的情況。

任何幫助將apprecatied

編輯:這是與MySQL

+0

請考慮提供適當的DDL和/或sqlfiddle與期望的結果集 – Strawberry

+0

什麼是DDL?抱歉新數據庫 – user3187726

+0

和新的谷歌? – Strawberry

回答

0

你應該將子查詢到from條款,而不是reviews獲得數:

SELECT g.id, g.title, g.developer, r.Numberofreviews 
FROM games g inner join 
    (SELECT games_ean, COUNT(*) as Numberofreviews 
     FROM reviews 
     GROUP BY games_ean 
    ) r 
    on g.ean = r.games_ean; 

它沒有意義的,有一個叫做review_title列,因爲可能有不止一個的審查。

+0

review_title列稍後會生效,以便用戶能夠提交他們的評論的快速總結,例如好/壞,以便其他用戶可以點擊它以獲得更詳細的評論。這就是說,我不需要在這裏打電話給那個專欄 – user3187726

1

您需要使用相關子查詢和錯誤上面清清楚楚地寫着應該有一列從你的子查詢

SELECT 
    g.id, 
    g.title, 
    g.developer, 

    (SELECT 
    COUNT(*) 
    FROM 
    reviews 
    WHERE games_ean = g.ean) AS Numberofreviews 
FROM 
    games g 
    INNER JOIN reviews r 
    ON g.ean = r.games_ean ; 
+0

您在哪裏將評論更改爲r是爲了縮短它的權利? – user3187726

+0

不僅縮短它,還給一個別名在子查詢中引用它像'WHERE games_ean = r.games_ean' –

+0

這樣它返回所有的評論,在這種情況下是每列5,但我試圖得到多少每場比賽有 – user3187726

-1

我試圖做的查詢是獲取一張表,顯示遊戲列表以及每個遊戲接收了多少評論。

SELECT games.id, games.title, games.developer, COUNT(DISTINCT reviews.*) as reviews_amount 
FROM games 
LEFT JOIN reviews ON games.ean = reviews.games_ean 
GROUP BY games.ean; 
+2

除此之外,'GROUP BY reviews.id'沒有意義。 –

+0

DISTINCT調用做什麼 – user3187726

+0

@ user3187726 http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count – Stafox

1

你得到錯誤「操作數應包含一列」,因爲你的子查詢返回兩列。在這種情況下只允許有一個。但是你根本不需要子查詢。做一個left join(萬一因爲沒有評論)和aggregate評論:

SELECT games.*, COUNT(reviews.games_ean) 
    FROM games 
    LEFT JOIN reviews ON reviews.games_ean = games.ean 
    GROUP BY games.ean; 

我認爲games.*是功能依賴於games.ean(即games.ean是唯一的)。


由於這一聲明似乎引起混亂我想強調的是,在分組的聲明非聚集屬性的投影爲它們functionally depended在該分組的屬性的屬性只被定義。聲明(假設games.ean是唯一的)因此是有效的,並且非常合理!

MySQL允許預測非聚合屬性,這些屬性在功能上並不依賴於它們!但是,它們沒有在ANSI-SQL中定義,也不確定,因爲MySQL爲每個非聚合屬性選擇一個未定義的值。

+0

請不要鼓勵使用非ANSI標準的「GROUP BY」。 – Kermit

+0

[爲什麼MySQL添加一個與SQL標準衝突的功能?](http://stackoverflow.com/questions/7594865/why-does-mysql-add-a-feature-that-c​​onflicts-with-sql-standards) – Kermit

+0

對不起,但我認爲它是合規的。 games.ean可能不是主要關鍵,但從OP的上下文來看,「games。*」在功能上取決於「games.ean」。否則,將它用作外鍵是沒有意義的。請詳細說明你看到衝突的地方。 –