【发布时间】: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 来建立友谊。