简单设计好友列表数据库

时间:2012-04-12 17:30:45

标签: php mysql

制作友谊系统数据库时遇到一个小问题。 现在我有一张名为朋友的桌子 让我们说:

表朋友:

    you      friend      approve     since
_________________________________________________
   wetube    youtube     1           4-12-2012
   facebook  wetube      1           4-12-2012

我有这个查询代码来获取名为wetube的用户的朋友。

mysql_query("SELECT f.* FROM friends f inner join users u on u.username =
f.you WHERE f.friend = 'wetube' UNION ALL SELECT f.* FROM friends f inner join users u on
u.username = f.friend WHERE f.you = 'wetube'");

现在我想要的是如何获取wetube的信息并在他的页面上显示给他。

固定:

最后我解决了这个问题。 所以这是表:

CREATE TABLE IF NOT EXISTS `friends` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `you` varchar(255) NOT NULL,
  `friend` varchar(255) NOT NULL,
  `type` varchar(255) NOT NULL,
  `since` date NOT NULL,
  `message` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

这是获取用户朋友的PHP代码

<?php
$username = $_SESSION['username'];
$friends_sql = mysql_query("SELECT * FROM friends WHERE (friend = '$username' OR you = '$username') ");
while($friends_row = mysql_fetch_assoc($friends_sql)){
if ($username == $friends_row['you']) {
echo $friends_row['friend']."<br/>";
} elseif($username == $friends_row['friend']) {
echo $friends_row['you']."<br/>";
}
}
?>

自己尝试100%

5 个答案:

答案 0 :(得分:4)

$result = mysql_query("SELECT * FROM friends WHERE friend='wetube'");
$row = mysql_fetch_array($result);

echo $row['friend'], ' - ', $row['since'];

答案 1 :(得分:2)

不是您问题的直接答案,但完全规范化的数据库将为此系统提供两个表。

由于这是多对多关系,我会做这样的事情:

UsersTable
------------------
id: int, serial
name: varchar
email: varchar
...

RelationshipTable
------------------
id: int, serial
user1_id: int, foreign key on UsersTable.id
user2_id: int, foreign key on UsersTable.id
approved: boolean
since: date

通过正确设计和规范化的数据库,更多易于管理和创建您的查询。

答案 2 :(得分:1)

你的意思是[朋友]专栏中有湿管的行?你可能只是过度思考联接:

SELECT * FROM [friends] WHERE [friend] = 'wetube'

如果你想在任何一列中使用wetube的地方:

SELECT * FROM [friends] WHERE [friend] = 'wetube' OR [you] = 'wetube'

或者:

SELECT * FROM [friends] WHERE [friend] = 'wetube'
UNION ALL
SELECT * FROM [friends] WHERE [you] = 'wetube'

答案 3 :(得分:1)

所有的wetube的朋友都是:

SELECT * FROM friends WHERE (friend = 'wetube' OR you = 'wetube') AND approve = 1

我建议删除列批准,而是保留一个请求表。这意味着所有已批准的请求都在friends表中,并且所有待批准的批准都在friend_request(或其他)表中。

这两个表的设计效率更高,因为当你想要向朋友展示时(通常可能很常见),你并不总是要检查approve = 1。

答案 4 :(得分:1)

也许不完全理解这一点。

从朋友f中选择* 其中f.you ='wetube'或f.friend ='wetube'

猜猜你在寻找用户信息,以及内部联接的原因。

可能会删除批准列,并有2条记录。第二个记录是朋友批准的朋友。 然后你可以很容易地看到你是谁的朋友,他们回来是朋友。

wetube --> youtube
facebook --> youtube
youtube --> wetube  wetube would approve a friendship request for youtube, adding a record
wetube --> facebook

然后你可以很容易地问谁是wetube的朋友。 只是一个想法,可能不是你想要的答案。