如何获取组详细信息以及成员详细信息和常见朋友(在组中)

时间:2016-03-27 04:25:26

标签: php mysql sql join

我有四张表如下

  • 用户表

    enter image description here

  • group_types表

    enter image description here

  • 分组表

    enter image description here

  • 朋友表

    enter image description here

  • group_users表

    enter image description here

关系视图如下 enter image description here

我想获取所有组详细信息,包括组名,组成员名称,组类型和用户朋友数(组中的朋友)

  

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 */;

0 个答案:

没有答案