我有四张表如下
我想获取所有组详细信息,包括组名,组成员名称,组类型和用户朋友数(组中的朋友)
USER_ID的示例JSON输出:1
{
group_name : "second",
group_type : "private",
group_members : "Minion,Ben",
friends_count : "1"
}
{
group_name : "fourth",
group_type : "public",
group_members : "Minion",
friends_count : "0"
}
说明
对于user_id 1,有三个group_ids,其中只有两个 (2,4)组是活动的,并且一(5)组是不活动的。所以组名称将是 第二,第四和相应的组类型将是PRIVATE,PUBLIC。
第2组有两个活跃成员(1和2),第4组只有一个 成员(1)。
第2组中出现的用户1朋友(仆从朋友)是(2,5) user_id 2处于活动状态,因此朋友数量为1。
类似于第4组,朋友数量将为0。
我尝试过两次查询
首先获取群组详情
select group_concat(uls.name) "username", gls.name "group name",gtp.name "group type",gus.status
from users uls
inner join groups gls
inner join group_types gtp
inner join group_users gus
on
uls.user_id=gus.user_id and
gls.group_id=gus.group_id and
gtp.type_id=gls.type_id
where gus.status='active'
group by gls.name, gtp.name, gus.status
使用其他查询获取好友详细信息 然后过滤两个查询结果
问题:我怎样才能做到这一点? 是否有其他方法可以使用连接
SQL DUMP FILE
--
-- Table structure for table `friends`
--
CREATE TABLE `friends` (
`id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`friend_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `friends`
--
INSERT INTO `friends` (`id`, `user_id`, `friend_id`) VALUES
(1, 1, 2),
(2, 1, 3),
(3, 5, 1),
(4, 3, 5);
-- --------------------------------------------------------
--
-- Table structure for table `groups`
--
CREATE TABLE `groups` (
`group_id` int(6) NOT NULL,
`name` varchar(20) NOT NULL,
`type_id` int(6) NOT NULL,
`user_id` int(6) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `groups`
--
INSERT INTO `groups` (`group_id`, `name`, `type_id`, `user_id`) VALUES
(1, 'first', 1, 5),
(2, 'second', 2, 2),
(3, 'third', 1, 2),
(4, 'fourth', 1, 4),
(5, 'five', 1, 3);
-- --------------------------------------------------------
--
-- Table structure for table `group_type`
--
CREATE TABLE `group_type` (
`type_id` int(6) NOT NULL,
`name` varchar(30) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `group_type`
--
INSERT INTO `group_type` (`type_id`, `name`) VALUES
(1, 'public'),
(2, 'private');
-- --------------------------------------------------------
--
-- Table structure for table `group_users`
--
CREATE TABLE `group_users` (
`user_id` int(6) NOT NULL,
`group_id` int(6) NOT NULL,
`status` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `group_users`
--
INSERT INTO `group_users` (`user_id`, `group_id`, `status`) VALUES
(1, 2, 'active'),
(5, 2, 'pending'),
(2, 2, 'active'),
(2, 3, 'pending'),
(2, 5, 'active'),
(1, 4, 'active'),
(1, 5, 'pending');
-- --------------------------------------------------------
--
-- Table structure for table `users`
--
CREATE TABLE `users` (
`user_id` int(6) NOT NULL,
`name` varchar(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `users`
--
INSERT INTO `users` (`user_id`, `name`) VALUES
(1, 'Minion'),
(2, 'Ben'),
(3, 'Lakki'),
(4, 'Bob'),
(5, 'Ananth');
--
-- Indexes for dumped tables
--
--
-- Indexes for table `friends`
--
ALTER TABLE `friends`
ADD PRIMARY KEY (`id`),
ADD KEY `inviter_id` (`user_id`),
ADD KEY `invitee_id` (`friend_id`);
--
-- Indexes for table `groups`
--
ALTER TABLE `groups`
ADD PRIMARY KEY (`group_id`),
ADD KEY `type_id` (`type_id`);
--
-- Indexes for table `group_type`
--
ALTER TABLE `group_type`
ADD PRIMARY KEY (`type_id`);
--
-- Indexes for table `group_users`
--
ALTER TABLE `group_users`
ADD KEY `user_id` (`user_id`),
ADD KEY `group_id` (`group_id`);
--
-- Indexes for table `users`
--
ALTER TABLE `users`
ADD PRIMARY KEY (`user_id`);
--
-- AUTO_INCREMENT for dumped tables
--
--
-- AUTO_INCREMENT for table `friends`
--
ALTER TABLE `friends`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=5;
--
-- AUTO_INCREMENT for table `groups`
--
ALTER TABLE `groups`
MODIFY `group_id` int(6) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
--
-- AUTO_INCREMENT for table `group_type`
--
ALTER TABLE `group_type`
MODIFY `type_id` int(6) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
--
-- AUTO_INCREMENT for table `users`
--
ALTER TABLE `users`
MODIFY `user_id` int(6) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=6;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;