запрос mysqli select, например запрос уведомления, выберите из четырех других таблиц, которые ограничены определенным значением ключа и возвращают единственный результат - PullRequest
0 голосов
/ 01 февраля 2019

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

1 Ответ

0 голосов
/ 20 февраля 2019

Эй, ребята, решение, которое я нашел, состояло в том, чтобы использовать подзапрос с объединением в предложении where, это облегчает ситуацию, вот запрос: user

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(
  SELECT feed_id FROM user_feed_comments WHERE user_phone='$phone' GROUP BY feed_id
  UNION
  SELECT user_feed_id FROM user_feed_likes WHERE phone='$phone' GROUP BY user_feed_id
  UNION
  SELECT post_id FROM user_feed_shared WHERE phone='$phone' GROUP BY post_id
  UNION
  SELECT user_feed_id FROM user_feed_reportes WHERE user_phone='$phone' GROUP BY user_feed_id )
  GROUP BY user_notification.tag,user_notification.feed_id
  ORDER BY user_notification.time_stamp desc;

Вы можете видеть, что в предложении where я использовал INпотому что там, где более одного результата, и в подзапросе я использовал UNION, чтобы объединить результат запроса, спасибо, ребята.Я также использовал Группировать в каждом подзапросе для группировки каждого тега и каждого идентификатора уведомления. Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...