制作友谊系统数据库时遇到一个小问题。 现在我有一张名为朋友的桌子 让我们说:
表朋友: 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%
答案 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的朋友。 只是一个想法,可能不是你想要的答案。