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.cat_name ではなくグループ化に c.id が使用されます。典型的なリレーショナル データベースでcat_nameは、結合、WHERE フィルタリングの実行、または並べ替えに使用されていないなど、フィールドにインデックスがない可能性があるためです。目的。

于 2012-11-21T21:09:03.110 に答える
0

質問:

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