Подход PHP + MySQL?

Я работаю над новостной лентой для моего приложения, как у вас на 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-запрос захватывать все за один раз, а не внутри цикла или чего-то еще, но я подумал, что я спрошу вас, ребята, на случай, если кто-то разберется с этой проблемой и придумает гениальное решение.

1

Решение

Я разобрался с решением. Вместо того, чтобы захватывать каждый пользовательский тип и хранить их в отдельных массивах для их итерации, я предварил оба массива по отдельности и создал одну строку для использования в качестве 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";
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]