SQL内部联接与计数

时间:2014-01-13 19:37:30

标签: mysql 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;

我想要的查询是获取一个表格,其中显示了游戏列表以及每个游戏收到的评论数量。

但是当我尝试实现上面的代码时,我得到的错误操作数应该包含一列

我看过其他人遇到这个错误,但情况不同。

任何帮助都会受到赞赏

编辑:这是mySQL

4 个答案:

答案 0 :(得分: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 ;

答案 1 :(得分: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为每个非聚合属性选择一个未定义的值。

答案 2 :(得分: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的列没有意义,因为可能会有多个评论。

答案 3 :(得分:-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;