2013-04-02 36 views
8

Tôi có một bảng partenaire. Một partenaire có thể có một hoặc nhiều địa chỉ. Và tất nhiên một địa chỉ có thể "thuộc về" cho nhiều hơn một partenaire. Vì vậy, tôi có 3 bảng: partenaire, partenaire_adresseadresse. Địa chỉ chỉ có một thị trấn (ville bằng tiếng Pháp) vì vậy tôi có khóa ngoài id_ville trong bảng addresse.Tham gia SQL và tham gia bên ngoài bên trái: tại sao các kết quả khác nhau?

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; 

này mang lại cho tôi những kết quả:

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

Bây giờ nếu tôi làm một LEFT OUTER JOIN trên bàn cuối cùng (region) kết quả là không giống nhau:

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; 

Không giống các kết quả. Xem:

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

tôi nghĩ rằng nó không nên, bởi vì trong truy vấn đầu tiên, id_region và id_departement không null, vì vậy nếu bạn làm một "THAM GIA" hay một "LEFT OUTER JOIN", kết quả sẽ là như nhau . Hay tôi đang thiếu một cái gì đó?

+2

Thêm đơn đặt hàng cho từng truy vấn để thực hiện bất kỳ loại so sánh có ý nghĩa nào dựa trên một vài bản ghi ở mặt trước. –

Trả lời

4

Sự cố bạn đang gặp phải liên quan đến thực tế là SQL không đảm bảo về thứ tự của kết quả khi không có thứ tự được chỉ định. Nếu bạn thêm mệnh đề ORDER BY, bạn sẽ nhận được kết quả tương tự, miễn là các bảng có các khóa khớp trên tất cả các hàng (tất nhiên).

+0

Tôi đã thêm "order by p.nom" và nó hoạt động cho cả hai. Những gì tôi không nhận được là có một chìa khóa trên "nom" của partenaire bảng, và với "tham gia" phải mất 28,9s, và với "bên ngoài bên ngoài tham gia", phải mất 0,10s! Làm thế nào đến? –

+0

Khá trung thực tôi không biết. Timings như thế nào mà không có thứ tự? bạn có thể thử sử dụng 'EXPLAIN' trên cả hai truy vấn để xem chúng được lập kế hoạch theo cách khác nhau như thế nào. – didierc

+0

+1 cho 'giải thích'. Tôi sẽ thử cái này Đối với "không có thứ tự", mất 0.10s. –

Các vấn đề liên quan