我是数据库的新手,在学校教授给我们做了功课。
我有以下表格:
游戏
id | game_id | game_name
类别
id | cat_name
辅助
id | game_id | cat_id
价格
id | game_id | price | developer
我需要选择ID为2的类别的平均价格,并将结果显示为像:
cat_name | avg_price
所以这是我的逻辑:
到目前为止,这是我的代码:
select prices.price
from (select helper.game_id
from helper
where helper.cat_id="2")
where prices.game_id = helper.game_id
当我运行它时,在phpMyAdmin中我收到错误:每个派生表必须有自己的别名。
那么如何分配这些别名(我已经试图通过互联网查看,但我不确定我是否了解它们)?
如果有人给我准备好代码,我可以学到更多东西。
谢谢!
答案 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 |