2014-01-13 150 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”。否则,将它用作外键是没有意义的。请详细说明你看到冲突的地方。 –