2014-10-31 2 views
1

잘 작동하는이 쿼리가 있습니다.join을 사용한 대체 구문

내가 하위 범주가 회사에 속하는 경우 행을 필요

또는

회사는 기본 하위 범주에 액세스 할 수 있습니다 (c.plannerdefaults = 1)와 하위 범주가 기본 하위 범주입니다 (s.company = 0)

SELECT distinct 
     s.category from planner_subcat s, company c 
      where 
       (
       c.id = 66 
       and c.plannerdefaults = 1 
       and s.company = 0 
       ) 
       or s.company = 66 

건이며, 아마 내 생각이 여기 잘못, 나는 인상을 가지고 그 쿼리는

select col from table1, table2 
0123로 시작하는 경우

방법론에는 문제가 있지만이 경우에는 조인을 사용하는 대안을 생각할 수 없습니다.

하나 있습니까?

+0

당신은 무엇을 의미합니까를? 실적면에서 의미가 있습니까? – enigma

+0

쿼리 및 로직에 문제가 없습니다. 당신은 자물쇠를 줄이기 위해 존재하는 논리를 사용하려고 시도 할 수 있습니다. – Jaylen

+0

당신이 사용하고있는 논리는 괜찮아 보입니다. 암시 적 외부 조인 (쉼표)을 명시 적 "OUTER JOIN"으로 바꿀 수 있습니다. INNER JOIN으로 이것을 구축하는 것은 아마도 꽤 추악해질 것입니다. 같은 테이블에 대한 여러 히트 또는 두 개의 선택 사이의 UNION, INNER JOIN이있는 UNION 및 OUTNER가있는 UNION 중 하나입니다. – JNevill

답변

1

내가 쿼리 이런 식으로 작성합니다 "방법론에 문제가"에 의해

SELECT s.category 
FROM company c 
JOIN planner_subcat s 
    ON c.id = s.company OR (c.plannerdefaults = 1 AND s.company = 0) 
WHERE c.id = 66; 
+0

이것은 내가 찾고 있었던 것이다! 조건부'ON' 절을 사용하는 것에 대해서는 생각하지 않았습니다. – andrew

1

여기에 목표가 무엇인지 확실하지 않습니다.

왜 쿼리를 다시 쓰고 싶습니까? 성능 문제가 있습니까?

대체 구문을 찾고있는 경우.

다음은 하위 쿼리를 사용하는 구문 중 하나입니다. 이 쿼리는 좀 더 빠를 수 있으며 테이블이 거대한 경우 행 잠금을 줄이거 나 (테스트하지 않아도되는지 여부는 알 수 없음)이 관계는 1 planner-to-many 회사가 아니라면 DISTINCT 함수가 필요하지 않습니다. 그것은 당신이 단순히 쿼리가이

SELECT DISTINCT s.category 
FROM planner_subcat AS s 
INNER JOIN company AS c ON c.company = s.company 
WHERE s.company IN(0,66) AND (s.company = 66 OR (c.id = 66 AND c.plannerdefaults = 1 AND s.company = 0)) 

시도 만 후 새로운 구문이하려는 경우 다른 관계가 다시

SELECT s.category 
FROM planner_subcat AS s 
WHERE s.company IN(66,0) AND (
s.company = 66 OR EXISTS (SELECT 1 FROM company AS c WHERE id = 66 AND plannerdefaults = 1 AND s.company = 0 AND company = s.company) 
) 

을 추가입니다하지만 내 첫 번째 쿼리는 귀하의 경우 더 좋을 것 같아 더 이상 DISTINCT를 사용할 필요가 없기 때문입니다. 나는 MySQL이 회사 = 0이 아닌 조건을 만족할 것이기 때문에 매번 하위 쿼리를 실행하지 않을 것이라고 생각할 것이다. 조건이 만족되면 더 많은 검사를 할 이유가 없다.

+0

을 원래대로 닮은 것으로 대답 할 수 있습니다. 위의 수수께끼에 대한 내 의견을 볼 경우 질문의 이유가 더 분명해질 수 있습니다. – andrew

+0

좋은 결과를주었습니다. +1 – andrew

+0

괜찮습니다. 나는 당신이 내 대답에 명시된 이유들 때문에 나의 첫 번째 질문을 사용할 것을 제안한다 – Jaylen