2013-05-19 44 views
15

Tôi có hai bảng: A và B được liên kết bởi "group_id".
2 biến Tôi đang sử dụng: $keyword, $_SESSION['user_id']MySQL LEFT THAM GIA Nhiều Điều kiện

Một
GROUP_ID
từ khóa

B
id
GROUP_ID
user_id

Tôi muốn có thể chọn tất cả các nhóm mà người dùng này không dựa vào tìm kiếm từ khóa.

Do đó, mục tiêu là CHỌN tất cả các hàng trong A WHERE user_id! = {$ _ SESSION ['user_id'} cho group_id tương ứng trong B AND như từ khóa.

đây là những gì tôi đã cố gắng:

SELECT a.* 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id 
WHERE a.keyword LIKE '%".$keyword."%' 
AND b.user_id!=$_SESSION{['user_id']} 
GROUP BY group_id 

Tuy nhiên, nó không tìm thấy bất kỳ hàng (phù hợp), trừ khi tôi loại bỏ AND b.user_id!=$_SESSION{['user_id']} trong trường hợp này nó cũng sẽ bao gồm các nhóm người sử dụng là đã có trong - đó không phải những gì là Tôi muốn.

Bất kỳ trợ giúp sẽ được đánh giá cao! Cảm ơn

+0

http://en.wikipedia.org/wiki/Prepared_statements – Brandon

Trả lời

30

Chỉ cần di chuyển với điều kiện thêm vào JOIN ON tiêu chí, cách này sự tồn tại của b không cần phải trả về một kết quả

SELECT a.* FROM a 
    LEFT JOIN b ON a.group_id=b.group_id AND b.user_id!=$_SESSION{['user_id']} 
    WHERE a.keyword LIKE '%".$keyword."%' 
    GROUP BY group_id 
+0

Cảm ơn bạn đã trả lời, tuy nhiên, điều này đã làm không làm việc. Nó đơn giản trả về tất cả các hàng trong Bảng 'a' bao gồm các hàng trong đó b.user_id bằng $ _SESSION ['user_id']. Tôi không chắc chắn tại sao nhưng tôi cho rằng nó phải làm với thực tế là một sự tham gia trái của nó? –

+1

Tôi nghĩ bạn đủ gần để biết câu trả lời :) Hãy thử sử dụng INNER JOIN thay vì tham gia bên trái – Bryan

+1

Không có INNER JOIN nào không hoạt động. Nếu tôi sử dụng INNER JOIN thì nó sẽ chỉ kéo các hàng từ Bảng A có một group_id tương ứng trong bảng B. Tôi cần nó để kéo tất cả các hàng trong Bảng A trừ các hàng trong đó user_id = $ _SESSION ['user_id'] (cho nhóm cụ thể đó) trong B. –

0
SELECT * FROM a WHERE a.group_id IN 
(SELECT group_id FROM b WHERE b.user_id!=$_SESSION{'[user_id']} AND b.group_id = a.group_id) 
WHERE a.keyword LIKE '%".$keyword."%'; 
6

câu trả lời chính xác chỉ đơn giản là:

SELECT a.group_id 
FROM a 
LEFT JOIN b ON a.group_id=b.group_id and b.user_id = 4 
where b.user_id is null 
    and a.keyword like '%keyword%' 

Ở đây chúng tôi đang kiểm tra user_id = 4 (id người dùng của bạn từ phiên). Vì chúng ta có nó trong tiêu chí kết nối, nó sẽ trả về giá trị null cho bất kỳ hàng nào trong bảng b không khớp với tiêu chí - tức là, bất kỳ nhóm nào mà user_id KHÔNG ở trong.

Từ đó, tất cả những gì chúng ta cần làm là bộ lọc cho các giá trị null, và chúng tôi có tất cả các nhóm mà người dùng của bạn không có trong.

demo here

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