我正在处理我的应用程序的新闻源,就像你在Facebook上的那样。所有新闻源帖子都在名为newsfeed
的同一个数据库表中。我的应用程序主要围绕用户和事件发展。 newsfeed
表有newsfeed_type
列(int,1-14表示newsfeed_types
表中的id' s)。每个新闻源条目还有other_id
和other_tabl
e + item_id
和item_table
。例如,用户向事件发布内容; 用户是属于other_id
表的users
,而事件是属于item_id
表的events
理想情况下,我希望通过降序时间戳排序约20个帖子,并使用"无限滚动"加载其余的帖子。在我的应用程序中我的脚本目前的工作原理是它首先收集用户正在参加的每个事件以及用户在单独的数组中跟随/朋友的所有用户。然后,它使用SQL查询一个接一个地迭代这两个数组:
$query = "select * from newsfeed where (other_id = ". $event["id"] ." and other_table = 'events') or (item_id = ". $event["id"] ." and item_table = 'events') order by date desc limit 10";
$query = "select * from newsfeed where newsfeed_type != 5 and ((other_id = ". $user["id"] ." and other_table = 'users') or (item_id = ". $user["id"] ." and item_table = 'users')) order by date desc limit 10";
我在没有意识到每个事件和用户要求10个条目的情况下制作了脚本。要求输入1个条目并不是理想的,因为用户可以跟随无数个事件,而每个项目只有一个新闻源帖子的用户。
你认为最好的办法是让它只抓取newsfeed
表中最近的20个条目,而不必迭代这两个数组,以获取获取新闻源条目所需的数据。时间?我想我可以在一个字符串中收集id
和table
并使SQL查询一次性获取所有内容,而不是在循环内或其他内容,但我想我可以如果有人已经解决了这个问题并想出一个天才的解决方案,请问你们。
答案 0 :(得分:0)
我找到了解决方案。我没有抓住每个用户类型并将它们存储在单独的数组中来迭代它们,而是分别对这两个数组进行预先编写,并将一个字符串用作sql查询,限制为25项。
$sql_string = "";
foreach ($events as $event) {
$sql_snippet = "(other_id = ". $event["id"] ." and other_table = 'events') or (item_id = ". $event["id"] ." and item_table = 'events')";
if ($is_adding == "true") {
$last_id = $_POST["last_id"];
$sql_snippet .= " and id < $last_id";
}
if ($sql_string == "") {
$sql_string = "(". $sql_snippet .") ";
} else {
$sql_string .= "or (". $sql_snippet .") ";
}
}
foreach ($users as $user) {
$sql_snippet = "(other_id = ". $user["id"] ." and other_table = 'users') or (item_id = ". $user["id"] ." and item_table = 'users')";
if ($is_adding == "true") {
$last_id = $_POST["last_id"];
$sql_snippet .= " and id < $last_id";
}
if ($sql_string == "") {
$sql_string = "(". $sql_snippet .") ";
} else {
$sql_string .= "or (". $sql_snippet .") ";
}
}
$query = "select * from newsfeed where newsfeed_type = 12 or ($sql_string) order by date desc limit 25";