2013-04-02 105 views
8

我有一個表partenaire。 partenaire可能有一個或多個地址。當然,一個地址可能「屬於」超過一個的partenaire。所以我有3個表格:partenaire,partenaire_adresseadresse。該地址只有一個城鎮(法語爲ville),所以我在addresse表中有一個外鍵id_villeSQL連接和左外連接:爲什麼結果不同?

SELECT 
    p.nom, 
    v.nom, v.id_region as id_r, v.id_departement as id_p, 
    r.description as region 
FROM partenaire p 
JOIN partenaire_adresse pa 
    ON pa.id_partenaire=p.id 
JOIN adresse a 
    ON a.id=pa.id_adresse 
JOIN ville v 
    ON v.id=a.id_ville 
JOIN region r 
    ON v.id_region=r.id 
LIMIT 4; 

這給我的結果:

+----------------------------+-------------+------+------+--------+ 
| nom      | nom   | id_r | id_p | region | 
+----------------------------+-------------+------+------+--------+ 
| Ferme Auberge Christlesgut | Breitenbach | 1 | 2 | Alsace | 
| Alice Pizza    | Strasbourg | 1 | 1 | Alsace | 
| Au Vieux Cellier   | Strasbourg | 1 | 1 | Alsace | 
| Auberge du 7Eme Art  | Strasbourg | 1 | 1 | Alsace | 
+----------------------------+-------------+------+------+--------+ 

現在,如果我在最後一個表做一個LEFT OUTER JOINregion)的結果是不一樣的:

SELECT 
    p.nom, 
    v.nom, v.id_region as id_r, v.id_departement as id_p, 
    r.description as region 
FROM partenaire p 
JOIN partenaire_adresse pa 
    ON pa.id_partenaire=p.id 
JOIN adresse a 
    ON a.id=pa.id_adresse 
JOIN ville v 
    ON v.id=a.id_ville 
LEFT OUTER JOIN region r 
    ON v.id_region=r.id 
LIMIT 4; 

不一樣結果。請參閱:

+---------------------+----------+------+------+----------------+ 
| nom     | nom  | id_r | id_p | region   | 
+---------------------+----------+------+------+----------------+ 
| 'Le 144' Petrossian | Paris 18 | 12 | 43 | Île-de-France | 
| 'Le 144' Petrossian | Paris 08 | 12 | 43 | Île-de-France | 
| 'O'Quai'   | Vouvray | 7 | 26 | Centre   | 
| 'O'Quai'   | Tours | 7 | 26 | Centre   | 
+---------------------+----------+------+------+----------------+ 

我認爲它不應該,因爲在第一個查詢,id_region和id_departement不爲空,所以如果你做一個「加入」或「LEFT OUTER JOIN」,結果應該是一樣的。或者我錯過了什麼?

+2

爲每個查詢添加一個訂單,根據前面的幾條記錄進行任何有意義的比較。 –

回答

4

您遇到的問題與SQL沒有確定結果順序時沒有指定順序有關。如果添加ORDER BY子句,則應該得到相同的結果,前提是表中的所有行都具有匹配的鍵(當然)。

+0

我已經添加了「order by p.nom」,它適用於兩者。我沒有得到的是表格partenaire的「nom」上有一個鍵,而「join」需要28.9s,而「left outer join」則需要0.10s!怎麼會? –

+0

老實說,我不知道。什麼是沒有秩序的時間?你可以嘗試在這兩個查詢上使用'EXPLAIN'來看看他們的計劃有多不同。 – didierc

+0

+1對'explain「。我會試試這個。至於「沒有訂單」,它花了0.10s。 –