mysql подсчитывает количество лайков каждого пользователя, количество твитов и количество подписчиков и подписчиков - PullRequest
0 голосов
/ 05 января 2020

Я создаю твиттер-приложение, используя node.js для развлечения, и у меня есть несколько таблиц:

пользователей : для хранения данных пользователей.

твиты : хранить твиты.

лайки : хранить то, что нравится пользователям, какие твиты.

ретвиты : хранить что пользователи ретвитнули, что твитят.

после : для хранения того, что пользователь следует за другими пользователями.

CREATE TABLE IF NOT EXISTS `following` (
  `user_id` varchar(50) NOT NULL,
  `followed_id` varchar(50) NOT NULL,
  `date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`,`followed_id`)
)

CREATE TABLE IF NOT EXISTS `likes` (
  `user_id` varchar(50) NOT NULL,
  `tweet_id` varchar(50) NOT NULL,
  `date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`,`tweet_id`)
)

CREATE TABLE IF NOT EXISTS `retweets` (
  `user_id` varchar(50) NOT NULL,
  `tweet_id` varchar(50) NOT NULL,
  `date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`,`tweet_id`)
)

CREATE TABLE IF NOT EXISTS `tweets` (
  `tweet_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `reply_to_tweet_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `reply_to_user_id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `truncated` tinyint(1) NOT NULL,
  `author` varchar(30) NOT NULL,
  `text` varchar(255) NOT NULL,
  `media` varchar(255) NOT NULL,
  `entities` json NOT NULL,
  PRIMARY KEY (`tweet_id`)
)

CREATE TABLE IF NOT EXISTS `users` (
  `user_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `email` varchar(30) NOT NULL,
  `username` varchar(30) NOT NULL,
  `password` varchar(255) NOT NULL,
  `handelname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `account_url` varchar(255) NOT NULL,
  `bio` varchar(255) NOT NULL,
  `profile_pic` varchar(255) NOT NULL,
  `cover_pic` varchar(255) NOT NULL,
  `protected` tinyint(1) NOT NULL,
  `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `username` (`username`)
) 

, и я хочу создать новое представление для пользователей, содержащее есть информация о том, сколько твитов им понравилось, количество пользователей, за которыми они следят, количество пользователей, которые следуют за ними, и сколько твитов они создали. Я хочу эту информацию в одной таблице, но я пробовал много способов, и ни один из них не работал для меня нормально! Как правильно решить эту проблему?

1 Ответ

2 голосов
/ 06 января 2020

Вы можете попробовать запрос ниже -

SELECT `user_id`
      ,LI.LI_CNT no_of_tweets_liked
      ,FL.FL_CNT no_of_followers
      ,FL2.FL2_CNT no_of_followee
      ,RT.RT_CNT no_of_retweets
FROM `users` U
JOIN (SELECT `user_id`, COUNT(`tweet_id`) LI_CNT
      FROM `likes`
      GROUP BY `user_id`) LI ON U.`user_id` = LI.`user_id`
JOIN (SELECT `user_id`, COUNT(`followed_id`) FL_CNT
      FROM `following`
      GROUP BY `user_id`) FL ON U.`user_id` = FL.`user_id`
JOIN (SELECT `followed_id`, COUNT(`followed_id`) FL2_CNT
      FROM `following`
      GROUP BY `followed_id`) FL2 ON U.`user_id` = FL2.`followed_id`
JOIN (SELECT `user_id`, COUNT(`tweet_id`) RT_CNT
      FROM `retweets`
      GROUP BY `user_id`) RT ON U.`user_id` = RT.`user_id`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...