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 

和结果:

name       | brand_id |    brand_father_id
Angry Bids |    3     |       1

如何从brand_id,中获取值brand_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不仅想要父亲的名字,还想要孩子的名字(也不是他们的身份证),所以更新了他们两个......

于 2012-06-25T02:53:57.080 回答
0

试试这个

SELECT
  game.name,    
  brand.name          AS brand_father_name,
  brndName.name       AS brand_name
FROM game AS game
  LEFT JOIN game_brand AS game_brand
    ON game_brand.game_id = game.id
  LEFT JOIN brand AS brand
    ON brand.id = game_brand.brand_id
  LEFT JOIN brand AS brndName
    ON brndName.id = brand.parent_id
WHERE game.id = 2
于 2012-06-25T08:27:44.560 回答
0

显然,如果您的模型和查询的约束被视为纯粹抽象的,那么 Nikola 的答案就是正确的。但是对于任何找到解决这个问题的方法的人,因为他们有相似的模型和相似的目标,这里有一种不同的方法:

通过将品牌表拆分为两个单独的表来消除品牌层次结构的不必要限制:

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 回答