2012-06-10 33 views
24

Tôi không thể hình dung điều này cho đến thời điểm này. Tôi đang cố gắng để tham gia hai bảng và chỉ chọn các hàng trong bảng A mà không có một cột phù hợp trong bảng B. Ví dụ, cho phép giả sử chúng tôi có một bảng người dùng và một bảng được gửi.MySQL chọn các hàng không có cột phù hợp trong bảng khác

users bảng có các cột sau: id, username
sent bảng có các cột sau: id, username

Tôi muốn chọn tất cả các hàng từ users nơi username không tồn tại trong sent bảng. Vì vậy, nếu tom ở trong users và trong sent, người đó sẽ không được chọn. Nếu anh ta đang ở users nhưng không ở trong sent anh ấy sẽ được chọn. Tôi cố gắng này, nhưng nó đã không làm việc ở tất cả:

SELECT pooltest.name,senttest.sentname 
FROM pooltest,senttest 
WHERE pooltest.name != senttest.sentname 

Trả lời

12

Hãy thử SQL này:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.username = users.username 
WHERE sent.username IS NULL; 

Cách tốt hơn theo ý kiến ​​của tôi sẽ là:

SELECT users.username 
FROM users 
LEFT JOIN sent ON sent.id = users.id 
WHERE sent.id IS NULL; 

Như cả các lĩnh vực id, sẽ được lập chỉ mục (khóa chính tôi sẽ phải suy nghĩ) để truy vấn này sẽ được tối ưu hóa tốt hơn so với truy vấn đầu tiên tôi đã đề xuất.

Tuy nhiên bạn có thể tìm thấy đề xuất đầu tiên của tôi tốt hơn cho bạn, nó phụ thuộc vào yêu cầu của bạn cho ứng dụng của bạn.

+0

qua một số khác giúp tôi cũng tìm thấy điều này để làm việc: SELECT * FROM pooltest LEFT JOIN senttest ON pooltest.name = senttest.sentname WHERE senttest.sentname IS NULL – xendi

53

Thông thường, bạn sẽ sử dụng NOT EXISTS cho loại truy vấn

SELECT p.Name 
FROM pooltest p 
WHERE NOT EXISTS (SELECT s.Name 
        FROM senttest s 
        WHERE s.Name = p.Name) 

Một thay thế sẽ được sử dụng một LEFT OUTER JOIN và kiểm tra NULL

SELECT p.Name 
FROM pooltest p 
     LEFT OUTER JOIN senttest s ON s.Name = p.Name 
WHERE s.Name IS NULL 

Lưu ý rằng cú pháp liên kết ngầm bạn đang sử dụng được coi là lỗi thời và phải được thay thế bằng tham gia rõ ràng.

-3

Có thể này có thể giúp bạn ....

Tôi cũng có cùng một vấn đề nhưng Giải Quyết sử dụng này truy vấn này

INSERT INTO tbl1 (id,name) SELECT id,name from tbl2 where (name) not in(select name from tbl1); 

hy vọng điều này sẽ giải quyết vấn đề của bạn

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