我正在开发一个朋友列表类型函数,它将显示用户的朋友,我遇到了一些逻辑问题。设置用于存储朋友的表的方式有3列; userid1,userid2和friendstatus。 friendstatus为1表示用户是朋友,状态为0表示请求正在等待。当用户将另一个用户添加为他们的朋友时,发送请求的用户将被置于userid1中,并且接收该请求的用户将被置于userid2中。
所以,我遇到的问题是让函数正确选择用户的朋友,而不是用户自己。基本上,我正在尝试使用此函数来确定哪个列是用户(例如我)以及哪个列是朋友。
我最初有第一个SQL语句如下,但这也不起作用。
$friends = mysql_query("Select * from friends where (userid1 = $myUsername OR userid2=$myUsername) AND friendstatus = '1'");
这是我想要创造的逻辑。
功能friendslookup只显示信息并提取用户信息。它没有增加逻辑。
$myUsername = $_GET['myFriends'];
if(isset($myUsername)){
$friends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
$friends2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
if(mysql_num_rows($friends) > 0 OR mysql_num_rows($friends2) >0 ) {
echo '<table><tr><td>Username </td><td> Location</td></tr>';
$col1rows = mysql_num_rows($friends);
$col2rows = mysql_num_rows($friends2);
}
for ($i=0; $i<$col1rows;$i++){
$myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
$friend = mysql_fetch_array($myFriends);
$friend_1 = $friend['userid2'];
friendsLookup($friend_1,$myUsername);
}
for ($i=0; $i<$col2rows;$i++){
$myFriends_2 = mysql_query("Select * from friends where userid2 = $myUsername AND friendstatus = '1'");
$friend = mysql_fetch_array($myFriends_2);
$friend_2 = $friend['userid1'];
friendsLookup($friend_2,$myUsername);
}
}
答案 0 :(得分:2)
我建议你在一个SQL中做所有事情(包括那个“friendsLookup”函数,'因为我打赌那里有另一个mysql查询),因为它会变得非常慢。假设您的用户的表是“用户”。使用此SQL:
$sql = "SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid2
UNION
SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.userid = f.userid1";
这将获取所有朋友(包括他们的用户信息)。此外,如果您想要排序或限制(或者您希望对结果做进一步的操作),您可以这样做:
例如,您希望按照名字按升序对朋友进行排序:
$sql = "SELECT * FROM (
SELECT * FROM user u, friend f WHERE f.userid1 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid2
UNION
SELECT * FROM user u, friend f WHERE f.userid2 = $myUsername AND f.friendstatus = '1' AND u.id = f.userid1 ) tblResult r
ORDER BY r.first_name ASC";
然后你可以通过这样做来获取最终结果:
$query = mysql_query( $sql );
while ( $col = mysql_fetch_array( $query ) ){
?>
<!-- DO YOUR THING HERE WITH PHP -->
<?php
}
最后,我想评论你的循环。注意你的循环中,你有这个代码:
$myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
$friend = mysql_fetch_array($myFriends);
这实际上是不必要的。第一行只是在每个循环中重置您的查询。删除第一行,在第二行,而不是使用$ myFriends,使用$ friends(这是您在顶部的第一个查询)。因此,对于第一个循环中的前两行,它应该如下所示:
$friend = mysql_fetch_array($friends);
对第二个循环也这样做。
答案 1 :(得分:1)
我会使用单个UNION&#cdql查询:
$myUsername = $_GET['myFriends'];
if(isset($myUsername)){
$friends = mysql_query("
SELECT userid1 as friendId
FROM friends
WHERE userid2 = $myUsername AND friendstatus = 1
UNION
SELECT userid2 as friendId
FROM friends
WHERE userid1 = $myUsername AND friendstatus = 1
");
if(mysql_num_rows($friends) > 0) {
echo '<table><tr><td>Username </td><td> Location</td></tr>';
while($friend = mysql_fetch_array($friends)) {
$friend_data = friendsLookup($friend['friendId'],$myUsername);
//display friend data here
}
echo '</table>';
}
}
答案 2 :(得分:1)
这可能会有所帮助:
SELECT (CASE $myUsername
WHEN `userid1` THEN `userid2`
WHEN `userid2` THEN `userid1`
END) AS `friend_ids`
FROM `friends`
WHERE $myUsername IN (`userid1`, `userid2`)
AND `friendstatus` = 1;
您的逻辑几乎没有问题 -
您不需要多次运行相同的查询。
只使用前2个查询,您可以通过从查询1中获取列“userid2”和从查询2中获取“userid1”列来阅读所有朋友。
在你的for循环中,你总是在读第一条记录。因此,在每次迭代中,您再次调用相同的查询并始终只读取第一条记录。相反,您应该运行一次查询并在循环中调用mysql_fetch_array()。
例如:
$myFriends = mysql_query("Select * from friends where userid1 = $myUsername AND friendstatus = '1'");
while ($friend = mysql_fetch_array($myFriends) {
$friend_1 = $friend['userid2'];
friendsLookup($friend_1,$myUsername);
}
希望以上有所帮助!