在我的Android应用程序中,我试图按照谁在线和谁不在线的顺序查看朋友列表 我用来做的代码是从friends表中提取请求标志(1)然后使用friend_id从users表中获取数据并使用json_encode将数据发送回app以显示它,朋友的顺序是以与用户表相同的顺序显示: 这是代码:
if(isset($_POST['list_friends'])) {
$sql = "SELECT friend_id FROM friends WHERE user_id='$user_id' && request='1'";
$res = mysqli_query($connection,$sql) or die(mysqli_error());
$row_to_json = array();
while($rows = mysqli_fetch_assoc($res)) {
foreach($rows AS $row) {
$sql2 = "SELECT * FROM users WHERE id='$row'
ORDER BY FIELD(is_online,'1') DESC";
$res2 = mysqli_query($connection,$sql2) or die(mysqli_error());
while ($rows2 = mysqli_fetch_assoc($res2)) {
//echo $rows_to_json = json_encode((object)$rows2);
$row_to_json[] = (($rows2));
}
}
}
echo json_encode(($row_to_json));
}
is_online字段是(0表示离线,1表示在线) 知道这段代码有什么问题吗?
编辑1:
我试过这段代码:
SELECT
friends.friend_id,users.is_online
FROM friends INNER JOIN users ON friends.user_id = users.id
WHERE
(friends.user_id = 21 and request = 1)
ORDER BY
(users.is_online) DESC
我添加users.is_online
来检查此字段的实际输出,这是得到的:
请注意,实际的is_online值存在于
**22**
和的用户表中**27**
**0**
不是**1**
!
编辑2:
**
完美:)
**
答案 0 :(得分:1)
我同意@Fahad Anjum的评论,&&
在AND
条件下WHERE
运算符非常不寻常。说完这个:
1)您可以完全取消FIELD()
功能,即写is_online
而不是FIELD(is_online, '1')
。
2)您正在使用数字足够的字符串(例如user_id = '$user_id'
而不是user_id = $user_id
)。这可能令人担忧,并且由于MySQL在这些情况下可能必须进行的隐式转换可能会导致性能损失,并且当涉及到FIELD()
函数时,可能是问题。
MySQL文档声明:
如果FIELD()的所有参数都是字符串,则将所有参数进行比较 字符串。如果所有参数都是数字,则将它们作为数字进行比较。 否则,参数将被比较为double。
在FIELD()
函数中,您混合了字符串('1'
)和数字(is_online
)参数(您已声明0
和{{1} } 1
的可能值,即is_online
包含数字。)
我问自己,当MySQL将这两个字符串is_online
与'1'
转换为1
之后,或者转换过程中发生了什么不好之后,会发生什么情况。从理论上讲,它不应该是一个问题,因为将数字转换为double
应该会产生与将字符串化数字转换为double
相同的结果,并且因为double
可以完全表示为{1
1}},但我可以想象我们这里有问题。不幸的是,我现在无法测试,但您可以尝试编写double
而不是FIELD(is_online, 1)
。
3)主要问题是:在第一次查询中,您选择具有给定FIELD(is_online, '1')
的用户的朋友。然后你循环遍历这些朋友,并且每个朋友正在对用户表执行查询以查明该用户(朋友)是否在线。
第二个查询每次只返回一行;因此,订购在这里没用。
您必须首先在$user_id
和friends
表之间进行联接来解决此问题。
由于我从未使用过PHP,我有点不愿意在这里建议代码(我不想通过用一种我甚至无法测试的语言发布代码来愚弄自己)。但您的查询将类似于以下内容:
users
请注意我在这里留下了你的第二个条件(SELECT
friends.friend_id
FROM
(friends INNER JOIN users ON friends.friend_id = users.id)
WHERE
(friends.user_id = $user_id)
ORDER BY
(users.is_online DESC)
),因为我无法想象这意味着什么,这里没有相关性。您可以轻松地将其重新添加到上面的代码中。