3

サンプルデータがあります

game(id, name)
      1 | Avatar
      2 | Angry Bids
brand(id, parent_id, name)
      1 | 0 | Apple
      2 | 0 | Samsung
      3 | 1 | Iphone 4
      4 | 2 | Galaxy Tab
game_brand(game_id, brand_id)
              1   | 4
              2   | 3

そしてクエリ:

SELECT game.name, 
       game_brand.brand_id, 
       (SELECT brand.parent_id 
        FROM   brand AS brand 
        WHERE  brand.brand_id = game_brand.brand_id) AS brand_father_id 
FROM   game AS game 
       LEFT JOIN game_brand AS game_brand 
              ON game_brand.game_id = game.id 
WHERE  game.id = 2 

AND 結果:

name       | brand_id |    brand_father_id
Angry Bids |    3     |       1

から値を取得する方法brand_idbrand_father_id例:

game       | brand    | brand parent
Angry Bids | Iphone 4 | Apple 
4

3 に答える 3

1
SELECT game.name, child.name AS brand_name, parent.name AS brand_father_name
FROM game_brand INNER JOIN game ON game_brand.game_id = game.id
INNER JOIN brand AS child ON game_brand.brand_id = child.id
INNER JOIN brand AS parent ON child.parent_id = parent.id
WHERE game.id = 2

更新しました

SELECT game.name, child.name AS brand_name, (SELECT name FROM brand AS parent WHERE child.parent_id = parent.id) AS brand_father_name
FROM game_brand INNER JOIN game ON game_brand.game_id = game.id
INNER JOIN brand AS child ON game_brand.brand_id = child.id
WHERE game.id = 2

再度更新

それでも、OPが父親の名前だけでなく、子供の名前も必要であることに気づきました(IDも必要ありません)ので、両方を更新しました...

于 2012-06-25T02:53:57.080 に答える
0

明らかに、モデルとクエリの制約が純粋に抽象的であると見なされる場合、ニコラの答えは的を射ています。しかし、同様のモデルと同様の目標を持っているため、この質問への道を見つけた人には、別のアプローチがあります。

ブランド テーブルを 2 つの個別のテーブルに分割して、ブランド階層の不要な制約を取り除きます。

brand(id, manufacturer_id, name)
      1 | 1 | Iphone 4
      2 | 2 | Galaxy Tab

manufacturer(id, name)
      1 | Apple
      2 | Samsung

これは、サンプル データ モデルから推定した特定の仮定に基づいています。

  1. ゲームが「親ブランド」に直接関係することはありません
  2. 「子ブランド」が「親ブランド」になることはありません

上記が当てはまる場合、manufacturerテーブルはより適切/正規化されており、クエリは次のように削減されます。

SELECT 
     game.name AS game, 
     brand.name AS brand, 
     manufacturer.name AS manufacturer
FROM game 
     JOIN game_brand ON (game.id = game_id)
     JOIN brand ON (brand_id = brand.id)
     JOIN manufacturer ON (brand.manufacturer_id = manufacturer.id)

上記は、メーカーと関係のあるブランドと関係があるすべてのゲームを返します。ブランドのみのゲームでもすべてのゲームを取得するには、少なくとも最後の結合に左結合を使用する必要があります。

于 2012-06-25T08:32:57.090 に答える