2011-11-12 61 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 
) 

也許有人可以幫助我,因爲我dont't得到它。非常感謝!

+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) 

的特定部分約束那張WHERE子句中,而不是在JOIN

+0

謝謝,我更新了查詢,不幸的是仍然有相同的錯誤結果。 – steve

+0

@ user707907正如nnnnnn已經說過,結果似乎正確的查詢...不是嗎?只有一個活躍客戶也在第1部分。 – Quasdunk

+0

嗨Quasdunk,非常感謝你的幫助。恩,那就對了。我已經糾正它,問題仍然存在。 – steve