Привет, ребята, надеюсь, вы в порядке.Я занимаюсь разработкой приложения для социальных сетей для Android и немного застрял в запросе mysqli.
База данных приложения состоит из каналов, которые можно комментировать, добавлять в избранное, сообщать и делиться ими; эти действия инициируют отправку уведомления заинтересованной стороне, а данные уведомления сохраняются в notification_table
.Информацию об уведомлении можно получить в модуле уведомлений в приложении.Моя проблема заключается в получении информации об уведомлении.
База данных состоит из пяти таблиц: feed table
, commented table
, likes table
, shared table
и notification table
.Теперь, когда пользователь комментирует канал, комментарий сохраняется в закомментированной таблице с идентификатором ссылки на таблицу каналов и идентификатором пользователя, который ссылается на информацию пользователя, который прокомментировал, уведомление отправляется владельцу канала, а информация уведомления сохраняется втаблица уведомлений со ссылкой на идентификатор канала.
Подобная цепочка событий происходит с аналогичной, общей и сообщаемой таблицами.Теперь, как я могу получить данные уведомления из таблицы уведомлений с помощью user id
, схема таблиц ниже
feed_table
| id | feed | user_id | time_stamp |
-----------------------------------------------
| 0 | good day | 25470159221 | 08/08/2018 |
| 1 | bad day | 254701594222 | 08/09/2018 |
| 2 | normal day | 254701594223 | 08/10/2018 |
Comment_feed_table
| id | feed_id|comment| user id | time_stamp |
-----------------------------------------------
| 0 | 0 |codding| 25470159221 | 08/08/2018 |
| 1 | 1 |bad cod|254701594221 | 08/09/2018 |
| 2 | 2 |mysqli |254701594222 | 08/10/2018 |
user_like_table
| id | feed_id |user_id | time_stamp|
----------------------------------------
| 0 | 1 |25470159221|08/08/2018 |
| 1 | 1 |25470159222|08/08/2018 |
| 2 | 0 |25470159221|09/10/2018 |
user_share_table
| id | feed_id |user_id | time_stamp|
----------------------------------------
| 0 | 1 |25470159221|08/08/2018 |
| 1 | 1 |25470159221|08/08/2018 |
| 2 | 0 |25470159222|09/10/2018 |
user_notification_table
| id | feed_id |notificator_id | time_stamp|
----------------------------------------
| 0 | 1 |25470159222 |08/08/2018 |
| 1 | 1 |25470159229 |08/08/2018 |
| 2 | 0 |25470159224 |09/10/2018 |
теперь я могу получить в уведомлении данные уведомления, в которых участвует user_id 254701594221 в порядке DESCtime_stamp как в том, кто комментировал, любил, делился в своевременном порядке
пробовал это следующим образом:
сначала получить feed_id комментариев пользователя, как и поделился, которые совпадают с уведомлением feed_id
function select_likes($con,$phone,$offset,$no_records){
$respond=array();
$sql="SELECT
user_notification.feed_id As feed_like,
user_feed_likes.user_feed_id
FROM user_feed_likes
LEFT JOIN user_notification ON user_feed_likes.user_feed_id= user_notification.feed_id
WHERE user_feed_likes.phone = '$phone'
GROUP BY user_notification.feed_id
ORDER BY user_feed_likes.time_stamp desc
LIMIT $offset,$no_records
";
$results=mysqli_query($con,$sql);
if (mysqli_num_rows($results)>0) {
foreach ($results as $key => $value) {
//echo "\n".$value['feed_id'];
array_push($respond,$value['feed_like']);
}
}
return $respond;
}
несколько раз для всех таблиц, таких как, поделиться, прокомментировать, затем использовать идентификаторы для выбора из таблицы уведомлений
function get_notification($con,$feed_id){
$respond=array();
$sql="SELECT
user_notification.id,
user_notification.feed_id,
user_notification.phone,
user_notification.message,
user_notification.tag,
user_notification.time_stamp,
user_credentials.username,
profile_pic.imagenamesized,
user_feeds.feed,
user_feeds.phone AS Feed_phone,
(SELECT username FROM user_credentials WHERE phone=user_feeds.phone) AS Feed_username,
(SELECT count(user_phone) FROM user_feed_comments WHERE feed_id=user_notification.feed_id ORDER BY id desc LIMIT 1) AS no_comments,
(SELECT count(phone) FROM user_feed_likes WHERE user_feed_id=user_notification.feed_id ORDER BY id desc LIMIT 1) AS no_likes,
(SELECT count(phone) FROM user_feed_shared WHERE post_id=user_notification.feed_id ORDER BY id desc LIMIT 1) AS no_shares
FROM user_notification
INNER JOIN user_credentials ON user_notification.phone=user_credentials.phone
LEFT JOIN profile_pic ON user_notification.phone=profile_pic.phone
LEFT JOIN user_feeds ON user_notification.feed_id=user_feeds.id
WHERE user_notification.feed_id IN('".implode("','",$feed_id)."')
GROUP BY tag ,user_notification.feed_id desc
ORDER BY user_notification.time_stamp desc;";
$results=mysqli_query($con,$sql);
if (mysqli_num_rows($results)) {
foreach ($results as $key => $value) {
array_push($respond, $value);
}
}
return $respond;
}
Проблема с этим методом заключается в том, что он не следует упорядоченному времени, особеннокогда новое смещение увеличивается (увеличение на странице лимита, например, Лимит с 0,10 увеличивается до Лимита с 10,20).
Во-вторыхгруппа по notification_id
не отображает последнюю запись, например, группа по notification_id
не отображает последнего человека, который прокомментировал или понравился.
Наконец, я не думаю, что обратная психология здесь применима в базе данныхзапрос, например, сначала выбирая комментарии, лайки и обмениваясь идентификаторами в разных запросах, а затем комбинируя их и выбирая уведомляемую таблицу с использованием этих feed_id, это выглядит как избыточный и трудоемкий запрос.или Facebook будет высоко оценен спасибо.