2011-11-16 3 views
1

내가 같이 일하는 친구 시스템을 작성하려고 해요 :PHP/MySQL의 친구 시스템입니까?

  1. 사용자 A가 사용자 B에 친구 요청을 보냅니다
  2. 사용자 B가 사용자 A.
  3. 사용자 A와 B에서 친구 요청을 수락 지금은 친구가되었습니다.

     
    CREATE TABLE IF NOT EXISTS `users` (
        `id` int(11) NOT NULL AUTO_INCREMENT, 
        `username` varchar(16) NOT NULL, 
        `password` char(32) NOT NULL, 
        `email` varchar(80) NOT NULL, 
        `dname` varchar(24) NOT NULL, 
        `profile_img` varchar(255) NOT NULL DEFAULT '/images/default_user.png', 
        `created` int(11) NOT NULL, 
        `updated` int(11) NOT NULL, 
        PRIMARY KEY (`id`), 
        UNIQUE KEY `email` (`email`), 
        UNIQUE KEY `username` (`username`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 
    
     
    CREATE TABLE IF NOT EXISTS `friend_requests` (
        `id` int(11) NOT NULL AUTO_INCREMENT, 
        `user_a` int(11) NOT NULL DEFAULT '0', 
        `user_b` int(11) NOT NULL DEFAULT '0', 
        `viewed` tinyint(1) NOT NULL DEFAULT '0', 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ; 
    
     
    CREATE TABLE IF NOT EXISTS `friends` (
        `id` int(11) NOT NULL AUTO_INCREMENT, 
        `user_a` int(11) NOT NULL DEFAULT '0', 
        `user_b` int(11) NOT NULL DEFAULT '0', 
        `friend_type` int(3) NOT NULL DEFAULT '1', 
        `friends_since` int(11) NOT NULL DEFAULT '0', 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 
    

    나는 사용자에게 "친구 SELECT * FROM WHERE user_a = $ 사용자 ID 또는 user_b = $ 사용자 ID"하지만 친구를 나열 할 수 있습니다 : 여기

내 데이터베이스 구조 테이블에서 username 또는 profile_img과 같은 데이터를 얻으려면 어떻게해야합니까?

+1

다른 'SELECT'문이나 'INNER JOIN'을 수행해야합니다. – ComFreek

답변

2
SELECT DISTINCT 
a.username, 
a.profile_img 
FROM 
users a 
WHERE 
a.id in (SELECT user_a FROM friends WHERE user_a = $userid OR user_b = $userID) 
and a.id <> $userid 

UNION 

SELECT 
b.username, 
b.profile_img 
FROM 
users b 
WHERE 
b.id in (SELECT user_b FROM friends WHERE user_a = $userid OR user_b = $userID) 
and b.id <> $userid 
+1

PHP를 사용하여 관리 할 수 ​​있습니다. 루핑 할 때 id를 확인하고 $ userID와 같으면 다음 결과로 이동하십시오. 또는 각 SQL 블록 (및 a.id <> $ userID) (및 b.id <> $ userID)의 마지막 두 줄에있는 위의 회신에 대한 편집 내역을 읽으십시오. – Hamikzo

+0

데이터베이스 구조가 제대로 설계되지 않았다고 생각합니다. 우정 요청 테이블과 우정 테이블을 사용할 때 우정에 중복성이 있습니다. 내 마음 속에서 우정 요청은 "승인"이없는 우정입니다. –

0

조인을 사용하여 테이블 친구를 사용자에게 가입시켜야합니다. 예 :

SELECT * FROM friends as f INNER JOIN users AS u ON u.id = f.user_a WHERE user_a = $userid 
9

난 당신이 overthunk 있다고 생각 문제 비트 (!).

User 테이블과 Friendship 테이블 만 가질 수 있습니다. 우정 테이블에는 UserID int, FriendID int, Created_at datetime, Confirmed_at datetime이 포함될 수 있습니다.

select * from User 
    left outer join Friendship on User.ID = Friendship.UserID 
    left outer join User as Friend on Friendship.FriendID = Friend.ID 
    where User.ID = <some users ID> 

편집 : 나는 그것을 자신의 주위에 처음 overthunk 가질 수

select * from Friendship 
    inner join User on Friendship.FriendID = User.ID 
    where Friendship.UserID = <some users ID> 

이것은 사용자의 친구를 얻을 것입니다) ... (MSSQL 구문)

아, 깜빡 했네. Confirmed_atnull 일 때 우정 요청은 아직 확인되지 않았습니다.