2017-12-26 11 views
3

이 항목을 만들면 문제를 더 잘 이해하기 위해 SQLFiddle 데모가 생성되었습니다.쿼리가 원하는 결과를 제공하지 않습니다.

먼저, 내가하고 싶은 것을 말하려고합니다. 사람들은 페이스 북을 통해 그룹 페이지를 만들 수 있습니다. 사람들이 내 소셜 네트워킹 프로젝트에서 그룹 페이지를 만들 수있게 만들었습니다. 페이스 북은 권장 그룹 이름으로 메인 페이지에 표시됩니다. 두 개 이상의 다른 제안 된 그룹이 있습니다. 그것이 내가하고 싶은 일입니다. 내 메인 페이지에서 추천 그룹을 보여주고 싶습니다.

사용 가능한 몇 가지 조건이 다음과 같이이 각각 있으며, 거기에 쿼리에서 볼 수 있듯이 그는이 권장 그룹에 설정 한 그룹을 볼 수 없습니다 그룹을 설정

1) 사람 .

2-) 사람은 권장 그룹에서 가입 그룹을 볼 수 없습니다.

권장 그룹에서 추천 그룹을 두 개 제안하고 싶습니다.

쿼리

은 여기에 있습니다 :

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover, 
    F.group_oid, 
    F.group_user_id 
FROM group_users F 
INNER JOIN groups G 
    ON G.group_id = F.group_oid 
WHERE 
    G.status = '1' AND 
    F.group_oid <> '10' AND 
    F.group_user_id <> '10' 
GROUP BY 
    F.group_oid 
ORDER BY rand() 
LIMIT 2 
  1. 첫 번째 문제는 다음과 같습니다 사람들은 제안 그룹에서 자신의 그룹을 참조하십시오. I 이 쿼리에서 제안한 자신의 그룹을 표시하고 싶지 않습니다.

  2. 두 번째 문제는 사람들이 제안한 그룹의 참여 그룹을 봅니다. 이 검색어에 제안 된 참여 그룹을 표시하고 싶지 않습니다. 다음과 같이

당신은 데모와 함께 첫 번째 문제를 테스트 할 수 있습니다

수 (10)가 그룹 sapsik을 만든 사람입니다 (16을 GROUP_ID). 이 쿼리에서 10을 사용하기 때문에이 행을 출력에서 ​​비활성화해야합니다. 다음과 같이

F.group_oid <> '10' AND 
F.group_user_id <> '10' 

또한 당신이 데모와 함께 두 번째 문제를 테스트 할 수 있습니다

numver (8)는 자신의 그룹을 생성하지 않는, 숫자 8 단지에 합류 그룹 16 (table group_users, row group_oid 16 , group_user_id 8). 그러나 다음과 같은 라인을 변경하면

F.group_oid <> '8' AND 
F.group_user_id <> '8' 

숫자 8은 여전히 ​​등록 된 그룹을 계속 볼 수 있습니다.

답변

4

F.group_oidF.group_user_id을 실제로 가져와야합니까?

하지 않으면, 당신은이 쿼리를 사용할 수 있습니다

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover 
FROM groups G 
WHERE 
    G.status = '1' AND 
    G.group_id NOT IN (
     SELECT F.group_oid 
     FROM group_users F 
     WHERE F.group_oid = '10' OR 
     F.group_user_id = '10' 
    ) 
ORDER BY rand() 
LIMIT 2 

쿼리의 문제는 두 사용자가 같은 그룹에있는 경우, F.group_user_id <> '10' 항상 진실 것입니다.

3

포스트 집계 필터링을 사용하는 또 다른 버전입니다. 기억해야 할 점은 WHERE 필터 행에 필터 그룹이 있습니다.

SELECT 
    G.group_id, 
    G.group_owner_id, 
    G.group_name, 
    G.group_title, 
    G.group_cover, 
    F.group_oid, 
    F.group_user_id 
FROM group_users F 
INNER JOIN groups G 
    ON G.group_id = F.group_oid 
    WHERE G.status = '1' 
GROUP BY 
    F.group_oid 
    HAVING SUM(F.group_oid = 10)=0 
    AND SUM(F.group_user_id = 10)=0 
ORDER BY rand() 
LIMIT 2