如何从列中获得平均值

时间:2012-11-21 20:59:56

标签: mysql database

我是数据库的新手,在学校教授给我们做了功课。

我有以下表格:

游戏

id | game_id | game_name

类别

id | cat_name

辅助

id | game_id | cat_id

价格

id | game_id | price | developer

我需要选择ID为2的类别的平均价格,并将结果显示为像:

cat_name | avg_price

所以这是我的逻辑:

  1. 首先,我需要找到哪些游戏被分配到id = 2
  2. 的类别
  3. 然后我只需从表格价格中选择相同的游戏 从第1步
  4. 得出
  5. 然后我需要以某种方式将结果写为 请求的
  6. 到目前为止,这是我的代码:

    select prices.price
    from (select helper.game_id
    from helper
    where helper.cat_id="2")
    where prices.game_id = helper.game_id
    

    当我运行它时,在phpMyAdmin中我收到错误:每个派生表必须有自己的别名。

    那么如何分配这些别名(我已经试图通过互联网查看,但我不确定我是否了解它们)?

    如果有人给我准备好代码,我可以学到更多东西。

    谢谢!

3 个答案:

答案 0 :(得分:1)

你得到的错误是因为当你像你一样做一个subselect时,你需要给出"衍生的"由subselect产生的表格是这样的别名:

select prices.price
from (select helper.game_id
from helper
where helper.cat_id="2") as helper_sub
where prices.game_id = helper_sub.game_id

请注意在WHERE子句中使用别名,因为您将其用作条件。

现在我已经回答了最初的问题,让我告诉你一个更好的方法来做到这一点。你应该在这里使用JOIN,因为子选择通常不是很理想。

SELECT c.cat_name AS cat_name, AVG(p.price) as avg_price
FROM
categories AS c
INNER JOIN helper AS h ON c.id = h.cat_id
INNER JOIN prices AS p ON h.game_id = p.game_id
WHERE c.id = 2
GROUP BY c.id

当然,我的假设是所有" id"它们是主键和外键的字段(如助手和价格表中)。这也是c.id用于分组而不是c.cat_name的原因,因为在典型的关系数据库中,您可能没有在cat_name等字段上没有用于连接的字段的索引来执行WHERE过滤或排序。

答案 1 :(得分:0)

select prices.price
from (select helper.game_id
    from helper
    where helper.cat_id="2") AS subtable
                            ^^^^^^^^^^^^---alias for derived table
where prices.game_id = subtable.game_id
                       ^^^^^^^^---using the alias

答案 2 :(得分:0)

QUERY:

<强> SQLFIDDLEExample

SELECT
c.cat_name,
AVG(price ) AS avg_price
FROM categories c
  LEFT JOIN helper h
    ON c.id = h.cat_id
  LEFT JOIN games g
    ON g.id = h.game_id
  LEFT JOIN prices p 
    ON p.game_id = g.id
WHERE c.id= 2
GROUP BY c.cat_name

数据:

INSERT INTO helper
    (`id`, `game_id`, `cat_id`)
VALUES
    (1, 1, 2),
    (3, 3, 1),  
    (2, 2, 2)
    INSERT INTO prices
        (`id`, `game_id`, `price`, `developer`)
    VALUES
        (1, 1, '12.5', 'EA'),
        (2, 2, '15.6', 'Woozie'),
        (3, 3, '25.6', 'Woozie')

结果:

| CAT_NAME | AVG_PRICE |
------------------------
|     good |     14.05 |