2012-05-13 55 views
11

Tôi có bảng 'meta_data' với các lĩnh vực sau:MySQL Tham gia Cùng Bảng

  • id
  • POST_ID
  • meta_key
  • meta_value

Tôi muốn để lặp thông qua và hiển thị danh sách bài đăng M (I (post_id) có mục nhập cho meta_key='abc' nhưng không phải một cho meta_key='def'

Về cơ bản, mỗi bài đăng có mục nhập meta_key='abc'nên có mục nhập meta_key='def'. Tôi muốn tạo danh sách để tôi có thể thêm các mục nhập thiếu meta_key='def'.

+5

Thật tuyệt - nhưng bạn đã thử những gì? –

Trả lời

14

Để đạt được điều này, bạn nên sử dụng hoạt động LEFT OUTER JOINtham gia cùng một bảng.

SELECT a.* 
FROM meta_data a 
LEFT OUTER JOIN meta_data b ON a.post_id = b.post_id AND b.meta_value = 'def' 
WHERE 
a.meta_value = 'abc' 
AND b.id IS null 
7

Hãy một bên ngoài (trái) tham gia vào chính nó, lọc trên những hồ sơ mà không trận đấu bằng cách tìm kiếm hàng với một id null trong bảng tham gia:

select t1.* 
from meta_data t1 
left join meta_data t2 on t2.post_id = t1.post_id and t2.meta_key='def' 
where t1.meta_key='abc' 
and t2.id is null