2011-11-12 2 views
2

내 상황 :MySQL의 이상한 여러 내부 조인 상황

표 "_customers"

---------------------------------------------- 
customer_id | name | active 
---------------------------------------------- 
    1   'customer I'  1 
---------------------------------------------- 
    2   'customer II'  0 
---------------------------------------------- 

표 "_projects"

---------------------------------------------- 
project_id | project_name | customer_id 
---------------------------------------------- 
    1    'project I'   1 
---------------------------------------------- 
    2    'project II'   2 
---------------------------------------------- 

대다 표 " _project_sections "

---------------------------------------------- 
section_id | project_id 
---------------------------------------------- 
    2    1 
---------------------------------------------- 
    3    1 
---------------------------------------------- 
    4    1 
---------------------------------------------- 
    1    2 
---------------------------------------------- 

필자의 경우 모든 고객이 필요하며 '활성'상태입니다. 또한 그들은 특정 섹션에서 있어야합니다. 예를 들어 섹션 1의 모든 활성 고객을 원합니다. 또한 id> 1 인 섹션이 필요한 경우에만 올바른 데이터를 얻으려고했지만 이상한 일이 발생했습니다. 섹션 1의 모든 활성 고객을 얻으려고해도 Query는 여전히 모든 프로젝트에 Section_id를 표시합니다. 2,3,4 ...

쿼리

SELECT c.customer_id, c.name, ps.section_id 
FROM _customers c 
    INNER JOIN _projects p 
    ON p.customer_id = c.customer_id 
    INNER JOIN _project_sections ps 
    ON ps.project_id = p.project_id 
    WHERE c.active = 1 AND ps.section_id = 1 
GROUP BY c.name 
ORDER BY LOWER(c.name) 

그리고 잘못된 결과 : 그것을 얻을하지 말자 때문에

Array 
(
[customer_id] => 1 
[name] => customer I 
[section_id] => 1 
) 

어쩌면 누군가가 나를 도울 수 있습니다. 정말 고맙습니다!

당신의 묘사에서
+0

표시 한 데이터에 대한 결과가 정확하지 않습니까? 섹션 1에는 하나의 프로젝트 만 있고 해당 프로젝트에는 오직 하나의 고객, 즉 고객 I 만 있습니다. 두 프로젝트 모두 단 하나의 고객, 고객 I 만 있으므로 실제로 지정한 섹션에 상관없이 해당 고객을 다시 얻게됩니다. – nnnnnn

+0

정말 미안 해요. 당신 말이 맞았습니다. 나는 바로 잡았습니다. 따라서 위의 경우 결과는 비어 있어야합니다. 그러나 불행히도 그것은 아닙니다. 고맙습니다! – steve

답변

2

이 쿼리를 작성하기 위해 GROUP BY 절이 필요하지 않습니다.

먼저 활성 고객과 해당 프로젝트를 살펴 보겠습니다.

-- All active customers 
SELECT c.customer_id, c.name 
FROM customers c 
WHERE c.active = 1; 

customer_id name 
-- 
1    customer I 

-- All active customers and their projects 
SELECT c.customer_id, c.name, p.project_id, p.project_name 
FROM customers c 
INNER JOIN projects p ON (p.customer_id = c.customer_id) 
WHERE c.active = 1; 

customer_id name   project_id project_name 
-- 
1   customer I 1   project I 
1   customer I 2   project II 

두 명의 프로젝트가있는 한 명의 적극적인 고객.

이제 섹션 1 프로젝트를 살펴 보겠습니다.

-- All projects from section 1 
SELECT ps.project_id, ps.section_id 
FROM project_sections ps 
WHERE ps.section_id = 1; 

project_id section_id 
-- 
2    1 

-- All projects from section 1, including project name 
SELECT ps.project_id, p.project_name, ps.section_id 
FROM project_sections ps 
INNER JOIN projects p ON (p.project_id = ps.project_id) 
WHERE ps.section_id = 1; 

project_id project_name section_id 
-- 
2    project II  1 

단 하나의 섹션 1 프로젝트. 이제 조각들을 합치십시오.

-- All active customers and their projects from section 1 
SELECT c.customer_id, c.name, p.project_id, p.project_name, ps.section_id 
FROM customers c 
INNER JOIN projects p ON (p.customer_id = c.customer_id) 
INNER JOIN project_sections ps ON (p.project_id = ps.project_id) 
WHERE c.active = 1 AND ps.section_id = 1; 

customer_id name   project_id project_name section_id 
-- 
1   customer I 2    project II  1 

그게 내가 기대하는 것입니다.

나중에. . .

데이터가 변경된 것으로 확인됩니다. 여기에서도 동일한 변경을하면 위의 마지막 쿼리는 행을 반환하지 않습니다. 나는 그것이 당신이 당신이 말한 것이라고 생각합니다. (그리고 데이터 변경으로 인해 기대했던 것입니다.)

1

쿼리가 있어야한다 :

SELECT c.customer_id, c.name, ps.section_id 
FROM _customers c 
    INNER JOIN _projects p 
    ON p.customer_id = c.customer_id 
    INNER JOIN _project_sections ps 
    ON ps.section_id = p.project_ID 
    WHERE c.active = 1 AND ps.section_id = 1 
GROUP BY c.name 
ORDER BY LOWER(c.name) 

특정 부분에 대한 제약 조건은 JOINWHERE 절에 가서하지.

+0

감사합니다. 불행히도 여전히 같은 잘못된 결과로 쿼리를 업데이트했습니다. – steve

+0

@ user707907 nnnnnn 이미 말했듯이, 그 결과는 질의에 맞을 듯합니다 ... 그렇지 않습니까? 1 부에 활동중인 고객이 한 명뿐입니다. – Quasdunk

+0

안녕하세요. Quasdunk, 정말 고마워요. 네, 맞습니다. 나는 그것을 고쳤다. 문제는 여전히 살아있다. – steve