Я работаю над новостной лентой для моего приложения, как у вас на Facebook. Все посты новостей находятся в одной и той же таблице БД. newsfeed
, Мое приложение развивается в основном вокруг пользователей и событий. newsfeed
стол имеет newsfeed_type
столбец (int, 1-14, ссылаясь на идентификаторы в newsfeed_types
Таблица). Каждая новостная лента также имеет other_id
а также other_tabl
е + item_id
а также item_table
, Например, пользователь публикует что-то на событие; пользователь это other_id
принадлежность к users
стол и событие это item_id
принадлежность к events
Таблица.
В идеале я хочу собрать около 20 сообщений, отсортированных по убыванию отметки времени, и загрузить остальные с помощью «бесконечной прокрутки» в моем приложении. Как PHP мой скрипт работает в настоящее время, так это то, что он сначала собирает каждое событие, которое посещает пользователь, и всех пользователей, с которыми он подписывается / дружит в отдельный массивы. Затем он повторяет два массива один за другим с помощью 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 запись тоже не было бы идеальным вариантом, поскольку пользователь может следить за бесконечным числом событий, а пользователи могут размещать только одну новостную ленту на элемент.
Как вы думаете, это лучшая практика, чтобы он захватывал только 20 самых последних записей в newsfeed
таблицу без необходимости повторять два массива, чтобы получить их данные, необходимые для получения записей новостной ленты по одному? Я думаю, я мог бы собрать id
и table
в одной строке и заставить SQL-запрос захватывать все за один раз, а не внутри цикла или чего-то еще, но я подумал, что я спрошу вас, ребята, на случай, если кто-то разберется с этой проблемой и придумает гениальное решение.
Я разобрался с решением. Вместо того, чтобы захватывать каждый пользовательский тип и хранить их в отдельных массивах для их итерации, я предварил оба массива по отдельности и создал одну строку для использования в качестве 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";
Других решений пока нет …