回声排序多维数组

时间:2014-06-22 21:49:43

标签: php mysql arrays sorting

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

f_id int(11)
uid int(11)
fids TEXT

现在它基本上就像每个用户的行一样,fids由许多数字值(其他用户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中的特定行的所有值1}}表。

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

$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_dump($updates_limit)时,它会占用评论表中的最后一行,然后让每个朋友看起来都发布了相同的评论。

任何人都可以看到问题或解决此问题的更好方法吗?

1 个答案:

答案 0 :(得分:1)

我完全重构了朋友表,看起来更像这样:(另外,使用英文 - 字符很便宜:c))

CREATE TABLE friends (
    user_id int FOREIGN KEY REFERENCES user(id)
    , friend_id int FOREIGN KEY REFERENCES user(id)
    , PRIMARY KEY (user_id, friend_id)
);

然后你可以采用基本相同的评论表:

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;

您甚至可以通过添加一些索引来加快速度 - 例如评论(user_id)。