2012-02-19 2 views
0

합류했다.MySQL의 중첩 된 쿼리에 대한 도움과 내가 세 개의 테이블이

Product (maker, model, type) 
PC (model, speed, ram, hd, price) 
Laptop (model, speed, ram, hd, screen, price) 

나는 모델 번호가격을 검색 할 수있는 방법 메이커 (A)에 의해 만들어진 모든 제품의?

가 나는

SELECT * 
    FROM Product 
    JOIN Laptop ON Laptop.model; 

SELECT * 
    FROM Product 
WHERE maker = "A" 
    JOIN type.model,type.price; 

이 시도 ...하지만 운이없는했습니다.

편집 : 내가 좀 더 일반적인 확인하려면 어떻게 그냥 노트북 및 PC 제조사가 아닌 A로 만든 모든 제품의 모델과 가격을 표시 할 수 있습니다?

+2

을'laptop'가'product' 테이블에 어떻게 관련되는지 보여주기 위해 두 번째 요구를 첫 번째 시도를 무시하고 - 당신은 단지 가입 1/2있어 기준. –

답변

3
(SELECT product.maker, laptop.model, laptop.price 
FROM Product 
INNER JOIN laptop ON product.model = laptop.model 
WHERE product.maker = "A") 
UNION 
(SELECT product.maker, pc.model, pc.price 
FROM Product 
INNER JOIN pc ON product.model = pc.model 
WHERE product.maker = "A") 
+0

당신은'UNION' 대신'UNION ALL'을 사용해야합니다. http://www.mysqlperformanceblog.com/2007/10/05/union-vs-union-all-performance/ –

+0

을 참조하십시오. 제가 좀 더 일반적으로 만들고 싶다면 어떻게하면 더 쉽게 모델과 가격을 표시 할 수 있을까요? 제조사 A가 아니라 노트북과 PC? –

+0

@ BluePonyInc. 데이터베이스 구조 변경을 고려할 수도 있습니다. 그대로 서면 각 제품 유형에 다른 유니온을 추가해야합니다. 내 생각 엔 제품 유형 (다른 테이블에 정의되어 있음)에 대한 열이있는 단일 제품 테이블을 원한다는 것입니다. 데이터베이스를 리팩토링하는 방법에 관한 질문을 올리고 싶을 수도 있습니다 ... – YXD

2
SELECT model, price FROM Product INNER JOIN PC ON Product.model = PC.model WHERE maker = "A" 
UNION 
SELECT model, price FROM Product INNER JOIN Laptop ON Product.model = Laptop.model WHERE maker = "A" 
2

몇 가지 포인트 : SQL에서

  1. 문자열은 작은 따옴표없는 따옴표입니다.
  2. UNION ALL을 사용해야합니다.
  3. PC에 PRODUCT에 가입하고 MODEL에서 LAPTOP to PRODUCT에 가입해야합니다.

다음은 SQL의 :

SELECT PC.MODEL, PC.PRICE 
FROM PC 
JOIN PRODUCT ON PRODUCT.MODEL = PC.MODEL AND PRODUCT.MAKER = 'A' 
UNION ALL 
SELECT LAPTOP.MODEL, LAPTOP.PRICE 
FROM LAPTOP 
JOIN PRODUCT ON PRODUCT.MODEL = LAPTOP.MODEL AND PRODUCT.MAKER = 'A' 
+1

셋째로, 1992 년 20 년 후에 요즘에는'JOIN'을 사용해야합니다. –

+0

+1 @ypercube. 공정한 전화. –

1

어떤 MySQL의 join tutorials에서 봐 자신 만에이 작업을 수행하는 방법을 알 수 있습니다.

product.modelpc.modellaptop.model을 모두 참조한다고 가정합니다. 당신은 아마 mysql IF을 사용하여 다음과 같이 질의합니다 :

SELECT IF(laptop.price IS NULL, pc.price, laptop.price) AS `price`, product.model 
FROM product 
LEFT JOIN pc ON (pc.model = product.model AND product.type = 'pc') 
LEFT JOIN laptop ON (laptop.model = product.model AND product.type = 'laptop') 
GROUP BY product.id 
HAVING price IS NOT NULL 
+0

좋지 않은 디자인입니까? 이것들은 일반적인'1 :: 0 ..1' 관계. –

+0

그리고 나는 당신이'product.type = 'pc '','.model'이 아니라고 생각했다. –

+0

@ypercube 고마워, 고쳤다 ... "좋은 디자인"에 대해 ... ..'product.model' 필드가 두 개의 다른 테이블을 참조 할 때 당신은 외래 키를 사용할 수 없으며 그것은 나에게 나쁜 생각입니다. – Vyktor

관련 문제