2012-06-25 4 views
3

나는 샘플 데이터가mysql에서 parent_id의 값을 가져 오는 방법은 무엇입니까?

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 
+0

좋은 질문이지만 예제 모델에 결함이 있습니다. 내가 말할 수있는 바에 따르면, 게임은 "부모 브랜드"와 직접적인 관계를 갖지 않을 것이며, "아동 브랜드"가 독자적으로 자녀를 가질 수도있는 것으로 보이지 않습니다. 이 경우 "상위 ID"와 모든 브랜드를 하나의 테이블에 포함시키는 것이 실제 가치가 없습니다. 대신, 부모 ID를 가진 "제조업체"또는 "회사"테이블을 갖는 것이 더 합리적 일 것입니다. 그러면 쿼리가 훨씬 간단 해지고 값 비싼 서브 쿼리가 필요하지 않게됩니다. (내가 말했듯이 이것은 당신의 모범 모델을 기반으로합니다. 좋은 질문입니다.) – Anthony

답변

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 

는 다시 그냥 지금 영업 이익은 아버지의 이름뿐만 아니라 아이 단지를 원하는 것으로 나타났습니다 다시 아직

및 업데이트 업데이트 된 하나의 (그리고 자신을 ids도) 업데이트되었으므로 둘 다 업데이트됩니다.

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 
0

분명히 모델과 쿼리의 조건이 순수한 추상으로 간주되는 경우 Nikola의 대답은 확실합니다. 그러나 비슷한 목표와 비슷한 모델을 가지고 있기 때문에이 질문에 대한 답을 얻은 사람은 다른 접근 방식을 사용합니다.

브랜드 테이블을 두 개의 별도 테이블로 분리하여 불필요한 브랜드 계층 구조를 제거합니다. :

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

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

이것은 특정 가정 내가 샘플 데이터 모델에서 추정하는거야 기반으로합니다

게임은 직접 "부모 브랜드"
  • A를 관련되지 않습니다
    1. "

      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) 
      

      것은 위의 모든 게임을 반환합니다 : 아이 브랜드는 상위 브랜드 "위의에 해당하는 경우, manufacturer 테이블이 정규화/더 적합하고 쿼리를 감소

    "는 없을 것 " 제조업체와 관계가있는 브랜드와 관계가 있습니다. 브랜드 만 갖고 있어도 모든 게임을 얻으려면 최소한 마지막 조인에 대해 왼쪽 조인을 사용하는 것이 좋습니다.

  • 관련 문제