2013-08-05 2 views
1

귀하의 도움이 필요합니다. 나는 질의를하고 내 id 1이 users_blocked 테이블에없는 사람들을 볼 수 있어야한다.차단 된 사용자에 대한 질문

는이 같은 시도 :

SELECT 
U.first_name, U.sex, U.age, U.id, UB.request_user_id, UB.block_user_id 
FROM users U, users_blocked UB 
WHERE U.sex <> 'm' 
AND NOT (UB.request_user_id = U.id AND UB.block_user_id = 1) 

하지만이 작동하지 않습니다

어떻게 그냥 테이블 사용자 32을 기록 볼 수 있습니까? 내가 질문 권리를 이해 한 경우 block_user_id 1과 동일하지 않고 기록을 모두 테이블에 존재하는 경우

Table: users 

id | first_name | sex | age 
1 | Mark  | m | 32 
2 | Alice  | f | 26 
23 | Lory  | f | 24 
32 | Jenny  | f | 25 


Table: users_blocked 

id | request_user_id | block_user_id 
1 | 2    | 1 
2 | 23    | 1 

답변

0

, 당신은 모든 레코드를 검색 할. 때문에, 내가 제대로 이해하면

SELECT 
    U.first_name, U.sex, U.age, U.id, UB.request_user_id, UB.block_user_id 
FROM users U 
INNER JOIN users_blocked UB ON U.id = UB.block_user_id 
WHERE U.sex <> 'm' AND UB.block_user_id != 1 
0
Select * from users u join users_blocked ub on u.id = ub.request_user_id where u.sex <> 'm' and ub.block_user_id != 1 
0

은 아마

SELECT u.id FROM users u 
INNER JOIN users_blocked ub ON u.id = ub.request_user_id 
WHERE u.sex <> 'm' and ub.block_user_id <> 1 
0

, 당신은 users_blocked 두 번에 users에 가입해야합니다 : 매트이 아래에 언급 된 쿼리가이보십시오 당신에게

도움이 될 수 두 개의 다른 열을 사용하여 가입하고 싶습니다 (users_blocked에 기록하지 않은 사용자가 다음 열 중 하나에 있음을 원하는 경우). request_user_idblock_user_id).

SELECT의 첫 번째 테이블이 사용자 인 경우 LEFT JOIN을 사용해야합니다. 먼저 모든 사용자를 선택해야하기 때문입니다. INNER JOIN을 사용하면 users_blocked에 레코드가없는 사용자는 선택되지 않습니다.

일단 이것을 입력하면 block_user_idrequest_user_id이 모두 NULL 인 모든 레코드가 필터링됩니다. WHERE 절이없고 SELECT *이 아닌 쿼리를 실행하면 더 명확하게 (그리고 왜)이 작동하는지 알 수 있습니다.

SELECT * 
FROM users u 
LEFT JOIN users_blocked blocked ON blocked.block_user_id = u.id 
LEFT JOIN users_blocked requester ON requester.request_user_id = u.id 
WHERE blocked.block_user_id IS NULL AND requester.request_user_id IS NULL 
관련 문제