2012-12-16 4 views
0

램프를 사용하고 있습니다. MySQL에서는 열 X, Y 및 Z가있는 테이블이 있습니다. 여러 세트와 하위 집합에서 고유 한 레코드를 선택해야합니다. 나의 초기 기준이 어디 있는지 Y = A;하나의 테이블에 여러 SQL 쿼리가 있습니다

  • 는 Y = A가
  • 는 X가 세트 B에 기록과 123
  • 가 D를 설정하기 = Z를 선택하여 C를 설정하기 레코드를 선택하여 B를 설정하기 님 그때 수 있어야 Y는 세트 B에 기록하고 Z를 선택하여 = 456
  • X는 설정 D에 기록하고 Z를 선택하여 설정 E를 가져 오기 = 789

표가 매우 커질 수 있고 정말 아니에요 이것으로 어디에서 시작해야하는지. 가능한 접근 방식은 다음과 같습니다.

  1. 개별 쿼리가 여러 개 있습니다. 이 경우 한 쿼리의 결과 집합을 다른 입력에 대한 입력으로 캐시하는 방법은 무엇입니까? Memcached?
  2. 중첩 된 하위 쿼리를 사용합니다. 그러나 내부 쿼리의 결과는 순전히 외부 쿼리를 제한하기위한 것입니다. 결과에 어떻게 표시 되나요?
  3. UNION을 (를) 사용하십시오. 그러나 어떻게 한 쿼리의 결과를 다른 쿼리의 입력으로 사용합니까?
  4. 테이블 자체를 여러 번 조인하십시오. 이것은 외부 행이 여러 번 반복되는 데카르트 결과를 생성합니다. 이것은 관리 할 수 ​​있어야하는 다차원 PHP 배열에 매핑됩니다. 성능은 어떻습니까?

나는 옵션 번호 4로 기울고 있지만 100 % 확실하지는 않습니다. 나는 바퀴를 다시 발명합니까? 많은 감사

...

+0

는 당신이 실제로 중간 세트 (B, C 및 D)가 필요하십니까하는 데 도움이, 또는 당신은 단지 설정 E 걱정합니까? –

+0

안녕하세요. Ripta, 예, 중간 세트가 필요합니다. –

답변

1

당신이 X에 대한 제한을 정의하지 않았기 때문에 나는 당신의 목표를 이해하지 않는다, 그러나 당신의 설명에서 그 설정 E가 비어있을 것입니다 생각합니다. 왜냐하면 Z가 459 인 행을 D가 이미 포함하고 있기 때문입니다. 따라서 Z가 789 인 조건에 대해 E를 생성하기 위해 결과 집합에서 다른 쿼리를 실행하면 D의 모든 행이 456이므로 행을 반환하지 않습니다.개인 의견에 이제

:

  1. 하는 것이 가능한 직교 제품을 피하십시오 - 좋은하지만 조심 조인을 쿼리를 생성 쿼리의 효율성을
  2. 을 개선하기 위해 테이블을 비정규 필요한 경우
  3. 가능하면 크로스 제품을하지 않는 것이 요구 사항을 충족 할 수있는 최소 결과 집합 생성 가능 가능하면 하위 쿼리를 사용하여 결과 집합 크기를 줄입니다.
  4. 쿼리 최적화를 신뢰합니다.
  5. 만들기 SQL은 가장 최적의 방법으로 위의 항목 # 4를 강조하기 위해

을의 데이터를 산출 할 수있는 능력과 자원을 가지고로 가능한 일을, 내가 좋아하는 것 R 그래서 가능하면 하위 쿼리를 방지 D에 대한 귀하의 예제에서 언급, 당신은 하위 쿼리 또는 기타 임시 저장하지 않고 다음 쿼리를 작성할 수 있습니다 이제

SELECT * FROM MyTable WHERE Y = A AND Z = 456 

을, 어쩌면 내가 당신이 원하는 것을 추측하여 딜레마를 해결하기 위해 시도 할 수 있습니다 :

SELECT * FROM MyTable WHERE Y = A AND Z IN (123, 456, 789) 

또는 :

SELECT * FROM MyTable WHERE Y = A AND (Z = 123 OR Z = 456 OR Z = 789) 

희망이

관련 문제