【问题标题】:Echoing Sorted Multidimensional Array回显排序多维数组
【发布时间】:2014-08-12 21:52:09
【问题描述】:

好的,所以我正在使用 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;
}

但每个人都会发布出现在他们每个朋友面前的 cmets。我的问题来自试图在发布时对这些 cmets 进行排序。 假设我的 cmets 表是:

c_id int(11)
uid int(11)
c_text TEXT
c_time int(11)

我希望能够让每个“朋友”发布的 cmets 将它们全部放入一个数组中,然后从它们的 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);

从每个朋友那里获取 cmets,按时间排序,然后将其切片到前 20 个。 但是,当我var_dump($updates_limit) 时,它会占用 cmets 表中的最后一行,然后看起来就像每个朋友都发表了相同的评论。

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

【问题讨论】:

  • 是否可以重构好友表?
  • 我同意 FrankieTheKneeMan 的重构问题。似乎最好将用户的朋友放在每个朋友的单独行中,而不是使用逗号分隔的 TEXT 列。例如,SELECT id FROM friends WHERE relationship = '$userid';
  • 只有 1000 行?这根本不应该花很长时间。您是否使用了正确的索引?
  • 这就是数据库的用途。 PHP 在这方面总是会更糟。
  • 另外,您绝对不需要单独的 id 来建立友谊。

标签: php mysql arrays sorting


【解决方案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
);

你的“朋友的 cmets 查询”变成:

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)。

【讨论】:

  • 谢谢,我之前有类似的设置,但我认为大量的行会降低效率和速度。
  • 我的意思是,它会,但它(几乎)总是比其他任何方式都快。我之前查询过数十亿行中的表,我保证您的 RDBMS 是初始实现的最佳选择。让您的数据库做数据库所做的事情 - 多年来非常聪明的开发人员一直在解决这些问题。
  • 感谢您的帮助,我将重构我的朋友表,设置正确的索引,然后恢复到以前的排序方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2018-07-11
相关资源
最近更新 更多