SQL выберите запрос, чтобы получить количество постов, подписчиков и подписок для конкретного пользователя - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть одна база данных с именем sdb, в ней есть 3 таблицы users, posts и users_follow

, для создания таблиц запросов для всех 3 таблиц следуют

-- users table

CREATE TABLE `users` (
 `user_id` int(11) NOT NULL AUTO_INCREMENT,
 `uname` varchar(25) NOT NULL,
 `email` varchar(35) NOT NULL,
 `password` varchar(255) NOT NULL,
 `user_status` enum('active','inactive','remove') DEFAULT 'active',
 `signup_at` datetime DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`user_id`)
) ENGINE=InnoDB;

данные таблицы пользователей

-- posts table

CREATE TABLE `posts` (
 `post_id` int(11) NOT NULL AUTO_INCREMENT,
 `title` tinytext NOT NULL,
 `content` text NOT NULL,
 `posted_at` datetime DEFAULT CURRENT_TIMESTAMP,
 `user_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`post_id`),
 KEY `posts_fk1` (`user_id`),
 CONSTRAINT `posts_fk1` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

данные таблицы данных

-- users_follow table

CREATE TABLE `users_follow` (
 `follow_id` int(11) NOT NULL AUTO_INCREMENT,
 `follower_id` int(11) DEFAULT NULL,
 `following_id` int(11) NOT NULL,
 `follow_status` enum('active','blocked') DEFAULT 'active',
 PRIMARY KEY (`follow_id`),
 KEY `users_follow_fk1` (`follower_id`),
 KEY `users_follow_fk2` (`following_id`),
 CONSTRAINT `users_follow_fk1` FOREIGN KEY (`follower_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `users_follow_fk2` FOREIGN KEY (`following_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;

users_follow table data

Я пытаюсь выполнить следующий запрос (для пользователя с user_id = 1)

SELECT a.user_id,
   SUM(CASE WHEN f.following_id = 1 THEN 1 ELSE 0 END) AS count_followers,
   SUM(CASE WHEN f.follower_id = 1 THEN 1 ELSE 0 END) AS count_followings,
   SUM(CASE WHEN p.user_id = 1 THEN 1 ELSE 0 END) AS count_posts
FROM users_follow f
RIGHT JOIN users a
ON f.following_id = a.user_id
RIGHT JOIN users b
ON f.follower_id = b.user_id
LEFT JOIN posts p
ON p.user_id = a.user_id
where a.user_id = 1;

выше, запрос возвращает тот же счет для count_posts и count_followers, count_following = 0

вывод: вывод

Ответы [ 2 ]

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

Производительность таблицы user_follow может быть улучшена:

CREATE TABLE `users_follow` (
 -- get rid of `follow_id`
 `follower_id` int(11) DEFAULT NULL,
 `following_id` int(11) NOT NULL,
 `follow_status` enum('active','blocked') DEFAULT 'active',
 PRIMARY KEY (follower_id, following_id),
 KEY `users_follow_fk2` (`following_id`),
 CONSTRAINT `users_follow_fk1` FOREIGN KEY (`follower_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE,
 CONSTRAINT `users_follow_fk2` FOREIGN KEY (`following_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB;
0 голосов
/ 14 февраля 2019

Полагаю, что вам, вероятно, нужно что-то в этом духе

select a.user_id,
       (
          select count(*)
          from posts p
          where a.user_id = p.user_id
       ) count_posts,
       (
          select count(*)
          from users_follow f
          where f.follower_id = a.user_id
       ) count_followings,
       (
          select count(*)
          from users_follow f
          where f.following_id = a.user_id
       ) count_followers
from users a

Если вы хотите написать это с использованием GROUP BY и внешнего соединения, то вам определенно нужно сделать это встроенными подзапросами.Поэтому как то так

select a.user_id,
       p.count_posts,
       f1.count_followings,
       f2.count_followers
from users a
left join (
  select a.user_id, count(*)
  from posts p
  group by a.user_id
) p on p.user_id = a.user_id
left join 
(
      select f.follower_id, count(*) count_followings
      from users_follow f
      group by  f.follower_id
) f2
left join f2.follower_id = a.user_id
(
      select f.following_id, count(*) count_followers
      from users_follow f
      group by  f.following_id
) f2 on f2.following_id = a.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...