2015-04-03 43 views
0

我有用于存储跟随其他人的人的表格。两列。我可以无法否定mysql中的条件

$stmt = $conn->prepare(" 
SELECT USERS.NAME, USERS.NAME2 
FROM USERS 
LEFT JOIN USERS_BOOKS ON USERS_BOOKS.USERID = USERS.ID 
LEFT JOIN FOLLOW ON FOLLOW.FOLLOW_ID = USERS.ID 
WHERE USERS_BOOKS.BOOKID = ? AND FOLLOW.USER_ID = ? 
"); 
$stmt -> execute(array($bookid, $session_userid)); 

但是查询这些特定用户遵循谁(并具有一定的书),我不知道如何查询那些我不明白。我不能简单地将WHERE子句修改为... AND NOT FOLLOW.USER_ID =? ,因为结果将包括我已经遵循的那些。下表是一个示例,其中USER_ID是跟随的人,FOLLOW_ID是跟随的人。

ROW USER_ID FOLLOW_ID 
1  6  1 
2  15  5 
3  13  8 
4  15  10 
5  15  12 
6  4  5 

第一个查询的结果是行号#2,#4,#5,因为USER_ID No.15跟在这三个用户之后。但是,当我说NOT FOLLOW.USER_ID = ?时,结果将是行号#1,#3,#6,意味着用户1,8,5。但我已经跟随用户5,那么我该怎么做?结果我只需要两行:#1和#3。

回答

0

您需要使用NOT EXISTS有一个子查询:

SELECT USERS.NAME, USERS.NAME2 
FROM USERS 
LEFT JOIN USERS_BOOKS ON USERS_BOOKS.USERID = USERS.ID 
WHERE NOT EXISTS (
    SELECT * FROM FOLLOW 
    WHERE FOLLOW.USER_ID = ? 
    AND FOLLOW.FOLLOW_ID = USERS.ID 
) 
AND USERS_BOOKS.BOOKID = ? 
+0

这导致大家谁我不跟随,而忽略他们对那本书的表达。 – erdomester 2015-04-03 22:05:30

+0

我在“不存在”中包含了两个条件 - 没有意识到你想保留一个而否定另一个。现在就试试。请注意,userid和bookid现在需要切换订单。 – 2015-04-03 22:44:36

+0

看起来它给出了正确的结果,但我必须在ON子句中将FOLLOW.FOLLOW_ID更改回USERS.ID,否则我会在'on子句'中得到未知列'FOLLOW.FOLLOW_ID'。 – erdomester 2015-04-03 23:11:04