2012-02-10 4 views
1
Table: Unit 
ID NAME VALUE 
1 Kilo 1000 
2 Mega 1000000 
3 Giga 1000000000 

Table: Storage 
ID Title Drive_value DriveUnitID Cache_value CacheUnitID Status_ID error error_unit area 
1 Seagate 100   3   400   1   2   1  1   1 
2 Scansoft 250   3   80   2   1   1  2   2 

Table: manufac 
    ID area 
    1 US 
    2 CHINA 

Table: Status 
ID Description 
1 Blah.. Blah 
2 Durka Durka 

원하는 목표는 세 번째 내부는 어떤 조건이없는 결합이 (아래)와 같은 세 개의 테이블을 뭔가를 연결하는 부속하지만mysql에서 하위 쿼리 내에 다른 테이블 조인을 추가하려면 어떻게해야합니까?

select 
s.title, 
t.description, 
x.area, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive, 
u3.value * s.error_value as Error 
((u4.value * s.error_value)+(u4.value * s.error_value)) as ErrorHigh 
((u5.value * s.error_value)-(u5.value * s.error_value)) as ErrorHigh 
from storage s 
join status t on t.id = s.status_id 
join manufac x on x.id = s.manufac_id 
join unit u1 on s.cache_unit_id = u1.id 
join unit u2 on s.drive_unit_id = u2.id 
join unit u3 on s.error_unit_id = u3.id 
join unit u4 on s.error_unit_id = u4.id 
join unit u5 on s.error_unit_id = u5.id 
+1

검색어가 올바른 구문이 아닙니다. 'INNER JOIN Status.ID ON t.ID'. 이게 뭐야? – DonCallisto

답변

1

이 쿼리는 의미 상 동일합니다. 하지만 기억 중 하나는 조인에서 테이블을 넣어 또는 절에서 : 명시 적으로

조인 암시 적으로

select s.title, t.description, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive 
from storage s 
join status t on t.id = s.status_id 
join unit u1 on s.cache_unit_id = u1.id 
join unit u2 on s.drive_unit_id = u2.id 

조인 :

select s.title, t.description, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive 
from storage s, status t, unit u1, unit u2 
where t.id = s.status_id and s.cache_unit_id = u1.id and s.drive_unit_id = u2.id 

최종 결과는 동일합니다 최종 사용자와 DBMS도 두 가지 방식으로 쿼리를 처리하므로 둘 중 하나를 사용하면 성능이 향상되지 않습니다.

편집 :

select s.title, t.description, 
u1.value * s.cache_value as Cache, 
u2.value * s.drive_value as Drive, 
u3.value * s.error_value as Error, 
u3.value * s.error_value * 2 as ErrorHigh, 
u3.value * s.error_value - u3.value * s.error_value as ErrorLow, 
m.area 
from storage s 
join status t on t.id = s.status_id 
join manufac m on m.id = s.area 
join unit u1 on s.cache_unit_id = u1.id 
join unit u2 on s.drive_unit_id = u2.id 
join unit u3 on s.error_unit_id = u3.id 

Example

결과 :

+----------+-------------+----------+--------------+---------+-----------+----------+-------+ 
| TITLE | DESCRIPTION | CACHE | DRIVE  | ERROR | ERRORHIGH | ERRORLOW | AREA | 
+----------+-------------+----------+--------------+---------+-----------+----------+-------+ 
| Seagate | Durka Durka | 400000 | 100000000000 | 1000 |  2000 |  0 | US | 
| Scansoft | Blah.. Blah | 80000000 | 250000000000 | 1000000 | 2000000 |  0 | CHINA | 
+----------+-------------+----------+--------------+---------+-----------+----------+-------+ 
    요구 후

    이 내가 당신이 찾고있는 생각하는 쿼리입니다 변경

  • 질문에 ErrorHigh라는 두 개의 열이 있습니다.
  • 수학 "오류"x + x = 2 * x (여기서 x = u4.value * s.error_value)
  • 아마도 최악의 수학 오류 :) x - x = 0 (여기서 x = u5.value * s .error_value)

그래서이 쿼리는 당신이 정말로 필요로하는 것은 아니지만 올바른 방향으로 이끌 수있을 것으로 생각됩니다. 행운을 빕니다!

+0

동일한 결과가 3 번 표시됩니다. – stackoverflow

+1

데이터 문제 여야합니다. 이 [link] (http://sqlfiddle.com/#!2/41f34/17)을 확인하십시오. 문제를 추적하기 위해 중복 된 데이터로 질문을 업데이트하십시오. –

+0

@MOstly Mostacho 당신이 볼 수 있다면 나는 원본을 바 꾸었습니다. 나는 msql 피들에 넣었지만 저장하지 않았다. – stackoverflow

3

가 쿼리를 확인이 구문 나던 일을하는 것입니다. 그리고 INNER JOIN으로가는 경우 FROM 절에 Status을 포함 할 필요가 없습니다.

SELECT 
s.Title, 
t.Description, 
u1.VALUE * s.Drive_value AS Drive, 
u2.VALUE * s.Cache_value AS Cache 
FROM Storage s 
INNER JOIN Unit u1 ON u1.ID = s.DriveUnitID 
INNER JOIN Unit u2 ON u2.ID = s.CacheUnitID 
INNER JOIN Status t ON t.ID = s.Status_ID; 
+0

@ Matten은 (는) FROM Storage, Status p입니까? 그 테이블 다음에 변수를 추가해야합니까?'p' – stackoverflow

+0

그래도 여전히 작동하지 않습니다. 나는 절의 오류로 알 수없는 열을 얻는다. – stackoverflow

+1

아니야, 내가 쓴 것처럼 괜찮아. 'Status'를'FROM' 절에 추가하지 마십시오. 어디서 오류가 발생합니까? – Matten

관련 문제