2011-06-06 153 views
0
 
SELECT * 
FROM `friends` AS Friend 
WHERE (
    (
    (
     Friend.user_id =1618 
     AND Friend.profile_id =290 
    ) 
    OR (
     Friend.to_user_id =1618 
     AND Friend.to_profile_id =290 
    ) 
) 
    AND (
    (
     Friend.user_id !=1817 
     AND Friend.profile_id !=393 
    ) 
    OR (
     Friend.to_user_id !=1817 
     AND Friend.to_profile_id !=393 
    ) 
) 
) 

我想,它们是具有这些记录((USER_ID = 1618和PROFILE_ID = 290)OR(to_user_id = 1618和to_profile_id = 290)),但我不包括是那些具有记录(( USER_ID = 1817和PROFILE_ID = 393)OR(to_user_id!= 1817 to_profile_id!= 393SQL查询问题

上面没有给输出,因为我想要的。

请帮我写查询相同。在先进 感谢。

+3

你的问题是什么?什么不起作用? – 2011-06-06 10:11:01

+0

@Pekka,它也会给我那些有user_id = 1817和profile_id = 393或to_user_id = 1817和to_profile_id = 393的记录。 – Jimit 2011-06-06 10:15:27

回答

3

您的“不”部分条件(1817,393)可能是您的问题的路线。

(user_id != 1817 AND profile_id !=393) OR (to_user_id != 1817 AND to_profile_id !=393)

例如;如果user_id和profile_id不匹配(1817,393),那么OR意味着to_零件不需要检查。 OR的左侧检查正常,右侧发生的并不重要。

可以说改革如下(假设我理解你正确)...

NOT ((user_id=1817 AND profile_id=393) OR (to_user_id=1817 AND to_profile_id=393))

有些人(比如我)一直试图推操作,以避免使用NOT,并保存那小小的一小部分处理。相信我,这是不值得的:)

SELECT * 
FROM `friends` AS Friend 
WHERE 
(
    (Friend.user_id = 1618 AND Friend.profile_id = 290) 
    OR 
    (Friend.to_user_id = 1618 AND Friend.to_profile_id = 290) 
) 
AND 
NOT 
(
    (Friend.user_id = 1817 AND Friend.profile_id = 393) 
    OR 
    (Friend.to_user_id = 1817 AND Friend.to_profile_id = 393) 
) 
) 
+0

作为旁注,否定也会起作用。这意味着他的代码可以在一个和那里工作,而不是一个or。 – JStead 2011-06-06 11:36:51

2

请尝试以下操作:!将否定整个第二块

SELECT * 
FROM `friends` AS Friend 
WHERE 
    ((Friend.user_id = 1618 AND Friend.profile_id = 290) 
     OR (Friend.to_user_id = 1618 AND Friend.to_profile_id = 290)) 

    AND (!(Friend.user_id = 1817 AND Friend.profile_id = 393) 
     OR (Friend.to_user_id = 1817 AND Friend.to_profile_id = 393))