Php 回音排序多维数组

Php 回音排序多维数组,php,mysql,arrays,sorting,Php,Mysql,Arrays,Sorting,好的,我正在用php和mysqli创建一个web应用程序。 我有一个表friends,这是一个简单的设置: f_id int(11) uid int(11) fids TEXT 现在,它基本上就像是每个用户的一行,具有FID,由许多数值(其他用户ID)组成,这些数值由逗号分隔,如:1,2,3 因此,我使用此功能获取每个用户的朋友: function getFriends($db, $userid) { $q = $db->query("SELECT fids FROM frien

好的,我正在用php和mysqli创建一个web应用程序。 我有一个表
friends
,这是一个简单的设置:

f_id int(11)
uid int(11)
fids TEXT
现在,它基本上就像是每个用户的一行,具有
FID
,由许多数值(其他用户ID)组成,这些数值由逗号分隔,如:
1,2,3
因此,我使用此功能获取每个用户的朋友:

function getFriends($db, $userid)
{
    $q = $db->query("SELECT fids FROM friends WHERE uid='$userid'");
    $ar = $q->fetch_assoc();
    $friends = $ar['fids'];
    $fr = explode(",", $friends);

    return $fr;
}
但每个人都会在自己的朋友面前发表评论。我的问题来自于试图在发布这些评论时对它们进行排序。 假设我的评论表是:

c_id int(11)
uid int(11)
c_text TEXT
c_time int(11)
我希望能够获得每个“朋友”发布的评论,将它们全部放在一个数组中,然后根据其
c_time
值对它们进行排序,然后从
comments
表中特定行中的所有值进行排序

问题来自我如何设置我的朋友表。 我正在使用:

$fr = getFriends($db, $userid);
        $updates = array();
        $i = 0;
        foreach( $fr as $friend)
        {
            // Get Updates from friends and from self
            $q = $db->query("SELECT up.*, u.* FROM updates up
                LEFT JOIN users u ON u.id = '$friend'
                WHERE (up.userid = '$userid') ORDER BY up.up_id DESC");
            while($ar = $q->fetch_array(MYSQLI_BOTH))
            {
                $updates[$i] = $ar;
                $i++;
            }
        }
            $sortArray = array(); 

            foreach($updates as $update){ 
                foreach($update as $key=>$value){ 
                    if(!isset($sortArray[$key])){ 
                        $sortArray[$key] = array(); 
                    } 
                    $sortArray[$key][] = $value; 
                } 
            } 
            $orderby = "up_id";
            array_multisort($sortArray[$orderby],SORT_DESC,$updates); 
            $updates_limit = array_slice($updates, 0, 20);
要从每个朋友那里获得评论,请按时间排序,然后将其分为前20条。 但是,当我
var\u dump($updates\u limit)
时,它会获取评论表中的最后一行,然后使它看起来像每个朋友都发表了相同的评论


任何人都能看到这个问题或解决这个问题的更好方法吗?

我会完全重构friends表,使其看起来更像这样:(另外,使用英语-字符便宜:c))

然后,您可以使用基本相同的注释表:

CREATE TABLE comment (
    comment_id int PRIMARY KEY
    , user_id int FOREIGN KEY REFERENCES user(id)
    , comment_text text
    , comment_time datetime
);
您的“朋友评论查询”变成:


您甚至可以通过添加一些索引(如注释(user_id))来加快速度。

重构您的好友表是一种选择吗?我同意FrankieTheKneeMan的重构问题。似乎最好将用户的好友分别放在每个好友的行中,而不是使用逗号分隔的文本列。例如,
从朋友中选择id,其中relationship='$userid'仅用于1000行?这应该不会花很长时间。您是否使用了正确的索引?这就是数据库的用途。PHP在这方面总是会更差。而且,你肯定不需要单独的id来建立友谊。谢谢你,我之前也有类似的设置,但我假设大量的行会降低效率和速度。我的意思是,它会,但它(几乎)总是比任何其他方式都快。我以前查询过数十亿行的表,我保证您的RDBMS是初始实现的最佳选择。让你的数据库做数据库所做的事情——多年来,非常聪明的开发人员一直在解决这些问题。感谢他们的帮助,我将重构我的friends表,设置适当的索引,然后恢复到以前对它们进行排序的方式。
CREATE TABLE comment (
    comment_id int PRIMARY KEY
    , user_id int FOREIGN KEY REFERENCES user(id)
    , comment_text text
    , comment_time datetime
);
SELECT comment_id, comment.user_id, comment_text, comment_time
  FROM friends
    INNER JOIN comment
      ON comment.user_id = friends.friend_id
  WHERE friends.user_id = ? #Target it
  ORDER BY comment_time DESC
  LIMIT 0, 20;