好的,所以我用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)
时,它会占用评论表中的最后一行,然后让每个朋友看起来都发布了相同的评论。
任何人都可以看到问题或解决此问题的更好方法吗?
答案 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)。