2013-08-23 2 views
1

사용자가 로그인하여 메시지를 게시 할 수 있도록 작은 사이트를 설정하고 있습니다. 연락처를 저장하는 테이블을 설정하는 중입니다 (사용자가 보드에서 서로 메시지를보고 보낼 수 있도록). 나는 거의 그것을 구성했지만로드 블록에 부딪쳤다.mysql에서 select 문으로 결과를 필터링하는 방법

When a user registers for the first time, an entry is created in each of two tables; users and contacts. The users table stores username and password stuff, the contacts table stores a directory of people on the system and whether they've been added to other people's contact lists. The tables look like this; 

mysql> select userid, firstname, lastname, username from users; 
+--------+-----------+----------+----------+ 
| userid | firstname | lastname | username | 
+--------+-----------+----------+----------+ 
|  63 | Chris  | Smith | csmith | 
|  64 | Susan  | Smith | ssmith | 
|  65 | Roger  | Smith | rsmith | 
|  66 | Diane  | Smith | dsmith | 
+--------+-----------+----------+----------+ 
4 rows in set (0.00 sec) 

mysql> select * from contacts; 
+----------+---------+-----------+ 
| username | contact | confirmed | 
+----------+---------+-----------+ 
| csmith | csmith | 0   | 
| ssmith | ssmith | 0   | 
| rsmith | rsmith | 0   | 
| dsmith | dsmith | 0   | 
| csmith | dsmith | 2   | 
| dsmith | csmith | 2   | 
| dsmith | ssmith | 1   | 
| dsmith | rsmith | 1   | 
+----------+---------+-----------+ 
8 rows in set (0.00 sec) 

사용자는 인증 할 수 있으므로 문제없이 서로 추가하고 제거 할 수 있습니다. "확인 된"열은 컨택의 상태를 저장합니다. 0은 등록시 사용자에게 작성된 연락처의 초기 항목을 표시하는 데 사용됩니다. 1은 초대장이 사용자 이름에서 연락처로 전송되었지만 아직 확인되지 않았 음을 나타냅니다. 2는 접촉이 확인되었음을 나타냅니다. 사이트의 다른 부분에 대한 선택 쿼리를 수행하여 사용자의 연락처 목록을 표시하거나 추가 할 수있는 시스템의 사람들 목록 만 표시 할 수 있습니다. 초대받지 않은 연락처의 디렉토리 목록을 제외하고는 거의 모든 것이 잘 작동합니다.

연락처의 초기 목록은 확인 된 상태가 0 인 사용자에 대한 선택 쿼리의 출력으로 구성되어야하며 사용자의 항목을 생략해야합니다 (따라서 자신을 추가하지 않아야 함). (나를 괴롭히는 부분), 자신의 사용자 이름으로 1 (초대장 발송) 또는 2 (확인 된) 확인을 가진 사람도 생략해야합니다.

csmith는 ssmith 및 rsmith 사용자의 디렉토리에서 볼 수 있지만 dsmith가 이미 연락처에 추가되었으므로 dsmith가 표시되지 않아야합니다 (연락처의 5 번째 항목에서 2가 확인 됨).

그래서 이러한 규칙에 따라 디렉터리 조회에 대한 쿼리를 작성하는 데 어려움을 겪고 있습니다. 어떻게 규칙을 만들 수 있습니까?

select contact from contacts where username!=$authenticated_user and confirmation='0'

이, 내 자신을 제외하고 나에게 아직 초대되지 않은 한 사람이 시스템에있는 사용자의 목록을 제공합니다. 이미 초대 및/또는 추가 된 사용자의 목록이 더 이상 표시하지 않도록

하지만 또한 출력으로부터

select contact from contacts where username=$authenticated_user and confirmation='1' and confirmation='2' 

끌어?

도움을 주시면 감사하겠습니다.

답변

0
SELECT DISTINCT `contact` 
FROM test.test 
WHERE `contact` 
NOT IN 
    (SELECT `contact` 
    FROM test.test 
    WHERE `username` = "csmith"); 

상호 우정에 대한 모든 항목이 형식으로 제공되는 (A -> B)와 (b이 -> A), 모든 초대는 형식으로 제공되는 (A -> B) 테스트를 단순화 - 우리 단지 $ username (p.ex. "csmith")이없는 사용자를 연락처 항목의 사용자 이름으로 검색해야합니다.

가 (이도를 통해 자신에게 연결된 기본 (가있는 사용자를 제외 않는, A, 0)입니다.)

+0

아니,이 문제가 해결되지 않습니다하지만 난 그게 바른 길에 생각합니다. 이 구문에 대해 질문이 있습니다. 내가 읽었을 때 내 인상은 "하위 쿼리 결과에 포함되지 않은 테이블에서 사용자 이름을 선택하십시오"라고 말하는 것입니다. 맞습니까? 이 서브 쿼리를 여러 개 추가 할 수 있습니까? – Kimomaru

+0

당신은 그렇습니다.하지만 그 주제에 대해 먼저 읽으면 좋을 것입니다. 끔찍한 결과가 나올 수 있습니다. 테스트 케이스와 로직으로 판단했을 때 정확히 작동하지 않는 것이 무엇인지 정말 흥미 롭습니다. 귀하의 요구 사항을 충실히 설명해 주시겠습니까? – Xevelion

+0

예, 물어봐 줘서 고마워요. 나는 너에게 너무 많이 부담하고 싶지 않았다. 후드에서 일어나는 일이 여기에 있습니다. 3 명의 사용자를 가정하십시오. csmith, dsmith 및 rsmith입니다.그들은 모두 사용자 테이블에 항목을 가지고 있으며 처음 등록 할 때 사용자 이름, 사용자 이름, 0 형식으로 연락처 테이블에 항목이 만들어졌습니다 (사용자 이름이 csmith이면 "csmith, csmith, 0"처럼 보입니다) .)이 항목은 – Kimomaru

관련 문제