2010-04-23 47 views
10

Tôi có truy vấn này trong MySQL:Left Join không trả lại tất cả hàng

SELECT pr.*, pr7.value AS `room_price_high` 
FROM `jos_hp_properties` pr 
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id 
WHERE pr7.field=23 

Bảng jos_hp_properties có 27 hàng nhưng truy vấn chỉ trả lại một. Dựa trên this question Tôi nghĩ rằng nó có thể là do mệnh đề WHERE. Bảng jos_hp_properties2 có id trường, thuộc tính, trường, giá trị, trong đó field là khóa ngoài cho bảng thứ ba (mà tôi không cần lấy dữ liệu từ).

Có cách nào để chọn tất cả các hàng từ bảng đầu tiên, bao gồm giá trị từ bảng # 2 trong đó trường là 23 (hoặc NULL nếu không có trường 23)?

Trả lời

27

Chắc chắn. Di chuyển WHERE điều kiện để JOIN:

SELECT pr.*, pr7.value AS `room_price_high` 
    FROM `jos_hp_properties` pr 
     LEFT JOIN `jos_hp_properties2` pr7 
     ON pr7.property=pr.id 
    AND 
     pr7.field=23 
+0

Cảm ơn! Câu trả lời trong câu hỏi tôi liên kết thực sự giải thích điều này, nhưng vì lý do nào đó nó không có ý nghĩa lần đầu tiên tôi đọc nó ... – DisgruntledGoat

+0

cảm ơn bernie giải pháp của bạn đã cứu cuộc sống của tôi – Devjosh

+0

Bạn được chào đón nhiều nhất. – bernie

0

Hãy thử điều này:

SELECT pr.*, pr7.value AS `room_price_high` 
FROM `jos_hp_properties` pr 
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id 
WHERE (pr7.field=23 OR pr7.field is null) 
+0

Đây không phải là truy vấn tối ưu - xem các câu trả lời khác, nơi tiêu chí pr7 được chuyển đến tham gia. –

+0

Vâng, tôi thấy rằng khi tôi đang gõ nó và nên thay đổi nó, nhưng tôi cảm thấy lười biếng. Câu hỏi này nhắc tôi nhớ đến tất cả các lập trình viên loại trừ những hàng cụ thể và sau đó mong đợi chúng xuất hiện một cách kỳ diệu bởi vì họ nói "tham gia bên ngoài". – MJB

6

Bạn phải đặt tiêu chí PR7 trong tham gia, không phải trong mệnh đề where. Mệnh đề where hoạt động trên toàn bộ tập kết quả SAU khi kết nối đã được thực hiện.

SELECT pr.*, pr7.value AS `room_price_high` 
FROM `jos_hp_properties` pr 
LEFT OUTER JOIN `jos_hp_properties2` pr7 ON pr7.property=pr.id and pr7.field=23