1

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

表友:

    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% 有效

4

5 回答 5

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

echo $row['friend'], ' - ', $row['since'];
于 2012-04-12T17:37:29.073 回答
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

使用正确设计和规范化的数据库,管理和创建查询将更加容易。

于 2012-04-12T17:49:30.357 回答
1

wetube的所有朋友都是:

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

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

这两个表设计更有效,因为当您想向朋友展示时(这可能很常见),您不必总是检查批准 = 1。

于 2012-04-12T17:44:51.793 回答
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 的朋友。只是一个想法,可能不是您正在寻找的答案。

于 2012-04-12T17:47:39.927 回答
1

你的意思是只有在 [friend] 列中有 wetube 的行?您可能只是过度思考连接:

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'
于 2012-04-12T17:38:45.310 回答