1

我是数据库新手,在学校教授给我们做作业。

我有以下表格:

游戏

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. 然后我只需要从表价格中选择与第 1 步结果相同的游戏
  3. 然后我需要以某种方式按要求写结果

到目前为止,这是我的代码:

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

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

那么如何分配别名(我已经尝试查看互联网,但我不确定我是否理解它们)?

如果有人给我准备好的代码,我可以从中学习一些东西,那就更好了。

谢谢!

4

3 回答 3

1

您得到的错误是因为当您像您一样进行子选择时,您需要为子选择产生的“派生”表提供如下别名:

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 过滤或排序的字段的索引目的。

于 2012-11-21T21:09:03.110 回答
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
于 2012-11-21T21:04:33.557 回答
0

询问:

SQLFIDDLE示例

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 |
于 2012-11-21T21:28:37.580 回答