2011-03-22 2 views
0

내 문제는 다음과 같습니다. 특정 "user_id"가 포함되지 않은 "groups"테이블에서 값을 선택해야합니다."* username *"이 아닌 값 선택

SELECT DISTINCT group.active, hide_group.user_id, group.group_id, hide_group.hide, group.desc AS group_desc 
FROM group 
LEFT JOIN hide_group ON hide_group.group_id = group.group_id 
WHERE (
hide_group.user_id != 'testuser' 
OR hide_group.user_id IS NULL 
AND (
hide != 'true' 
OR hide IS NULL 
) 
) 
AND active =1 
ORDER BY `group`.`group_id` ASC 
LIMIT 0 , 500 

을하지만 지금 우리는 내 'group_hide'테이블에 그러한 기록이 있다고 할 수 있습니다 : 그래서이 실행 그래서 지금은 내 쿼리를 수행 할 때

[group_hide] 
(user_id, group_id, hide) 
john, ABC, true; 
joe, ZZZ, true; 
mark, ABC, true; 

를, 마크는 여전히 때문에 ABC 그룹을 본다 조건은 true이고 user_id = john이기 때문에 유효합니다. 따라서 표식으로 숨겨져 있어도 ABC 값을 취합니다. 이 쿼리를 여러 번 변경하려고 시도했지만이 간단한 문제를 파악할 수 없습니다.

+0

또한보십시오 [이 질문에] (http://stackoverflow.com/questions/5353532/combining-sum- 그룹 별 및 좌회전 - 반환 - 부정확 한 결과 - 수정 방법/5354267 # 5354267) – jswolf19

답변

2

나는 하위 쿼리를 사용하는 것이 좋습니다 :

SELECT * 
FROM group 
WHERE group_id NOT IN (
    SELECT group_id 
    FROM group_hide 
    WHERE user_id = 'testuser' 
    AND hide = true) 
AND active =1 
ORDER BY `group`.`group_id` ASC 
LIMIT 0 , 500  
0

당신은 가입 결과에 대한 조건을 적용하는 데 사용할 수 있습니다. 또한 DISTINCT 대신 GROUP BY를 사용합니다.

나는 완전히 WHERE 조건을 (난 당신이 괄호 일부 호환 문제가 있다고 생각)에 따라 잘 모르겠지만, 여기 당신이 필요로하는 결과를 얻을 수있는 버전입니다 : 당신이 게시하는 경우

SELECT DISTINCT group.active, hide_group.user_id, group.group_id, hide_group.hide, group.desc AS group_desc 
FROM group 
LEFT JOIN hide_group ON hide_group.group_id = group.group_id 
WHERE active =1 
HAVING (hide_group.user_id != 'testuser' 
     OR hide_group.user_id IS NULL) 
     AND 
     (hide != 'true' 
     OR hide IS NULL) 
ORDER BY `group`.`group_id` ASC 
LIMIT 0 , 500 

을 테이블 구조, 일부 샘플 데이터 및 샘플 원하는 출력, 당신은 작업 쿼리와 더 나은 응답을 얻을거야 ...