如何以特定顺序显示Mysql条目

时间:2017-10-05 17:35:07

标签: php android mysql

在我的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来检查此字段的实际输出,这是得到的: Actual mysql result from query

  

请注意,实际的is_online值存在于**22**和的用户表中   **27** **0**不是**1**

编辑2:

**

  

完美:)

**

Exactly what i need

1 个答案:

答案 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_idfriends表之间进行联接来解决此问题。

由于我从未使用过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) ),因为我无法想象这意味着什么,这里没有相关性。您可以轻松地将其重新添加到上面的代码中。