2009-09-25 10 views
0

한 성명에서 선택하지만 난이 데이터를 가져 오는 방법을 잘 모릅니다다중이 설명하기 어려운

- select id from customers 
- foreach customer find the order with that id 
-- foreach order (for that customer) 
--- select product.name, product.max on order.productId=product.id 

해야합니다. 여러 개의 개별 선택이 필요합니까? 긴 단일 SQL 문을 쓸 수 있습니다 (';'별도로 계산 : P). - 단지와 가입의 추가 수준을 추가

SELECT c.id, o.id, p.name, p.max 
    FROM Customers AS c 
     JOIN Orders AS o ON c.id = o.customer 
     JOIN Product AS p ON o.productID = p.id 

가능성, 당신은 주문 테이블과 OrderItems에 테이블이 어떻게이

+1

내가 조인하려고 노력하지만, 당신이 표준에 따라 큰 따옴표, 또는 돌아 구분 기호에 묶어 경우 우리는 모든 SQL 데이터베이스를 식별자로 키워드의 사용을 허용 –

답변

4

를 사용하여 조인 ...... 내가 행에서 하위 행을 끌어 할 적절한 조건.

'ORDER'키워드와의 충돌을 피하기 위해 '주문'이라고 가정합니다. 나는 당신이 MAX 기능에서 Product.Max를 모호하게 만든다고 생각하지 않았습니다. DBMS가 허용하는 것에 대해 걱정해야 할 수도 있습니다 (일부는 키워드의 남용에 대해 관대하며 일부는 허용하지 않습니다).


(이상 허용)을 허용

DBMS는 IBM 인포믹스 다이내믹 서버 (IDS)입니다 :

CREATE TABLE table(null INTEGER, integer CHAR(3), date DECIMAL(10,0), decimal DATE); 

의미가 있습니다 - 그것은 무서운 것입니다. 그러나 나중에 추가되는 키워드로 많은 문제를 피할 수 있습니다.

+0

을 알게 될 것입니다 그래서 일부 테이블을 스키마를 줄 것이다 MySQL에서는 -ticks를, MS SQL Server에서는 대괄호를 사용합니다. –

+0

예 - 동의 함 (이론적으로). IDS는 CREATE TABLE 문을 쓰여진 것처럼 보이게하며 (시야에 큰 따옴표가 아닌), 구분 된 식별자를 받아들이도록 (클라이언트 환경에 설정된 환경 변수) 조정이 필요합니다. 그러한 것들이 현실 세계의 모호함입니다. (IDS의 전작 제품은 큰 따옴표를 작은 따옴표로 사용할 수있었습니다. SQL-86이 표준화 된 바로 그 시점에, 구분 된 식별자를 표준화 한 SQL-86 또는 SQL-89인지 확실하지 않습니다. 이전 버전과의 호환성 ...). –

0

단일 복합 쿼리에서 얻을 수있는 것은 일대 다 관계의 단일 끝에 대한 반복 필드 값입니다. 그렇다면 푸 : 바 : 1 :

당신이 바있는 다른 테이블 바즈에 추가하는 경우
foo1 bar1 
foo1 bar2 
foo1 bar3 
foo2 bar4 
foo2 bar17 
foo3 bar78 

: 바즈 :: 1 : 다음 모든 바 얻고 자신의 FOOS이 같은 반환 쿼리와 많이 많이,

foo1 bar1 baz1 
foo1 bar1 baz2 
foo1 bar1 baz3 
foo1 bar2 baz15 
foo1 bar3 baz32 
foo1 bar3 baz33 
foo2 bar4 baz17 
foo2 bar17 baz21 
foo3 bar78 baz7 

이것은 정확히 SQL이 수행해야하는 작업입니다. 그러나 대답을 예쁜 형식으로 출력하려고 할 때 약간의 문제가 있습니다. 이것이 애플리케이션 코드가 들어있는 곳입니다. $ holder를 foo 필드와 동일하게 설정하고 루프를 통과 할 때마다 새로운 foo가 이전 foo와 다른지 확인하십시오. $ bar와 동일하게하십시오. 그래서 :

$fooholder=NULL; 
$barholder=NULL; 
foreach ($result as $row_array) { 
    if(empty($fooholder)) { 
    $fooholder=$row_array['foo']; 
    $barholder=$row_array['bar']; 
    } 

    if ($fooholder!=$row_array['foo']){ //new foo value, so next section 
    //output $row_array['foo'] since it's new 
    $fooholder=$row_array['foo']; 
    } 

    if ($barholder!=$row_array['bar']){ //new bar value, so next section 
    //output $row_array['bar'] since it's new 
    $barholder=$row_array['bar']; 
    } 

    //output $row_array['baz'] 

} 
관련 문제