现在几天我都试图解决这个问题。 我有表group_user,group_name。 我想要做的是选择用户组,而不是组(来自group_name)的描述,以及组中的其他10个用户。
前两个没问题。问题是,我无法获得限制用户。
我可以选择user_group和该组中的其他用户。我不知道如何限制它。 使用:
SELECT a.g_id,b.group,b.userid
FROM group_user AS a
RIGHT JOIN
(SELECT g_id as group, u_id as userid FROM group_user) AS b ON a.g_id=b.group
WHERE u_id=112
它显示了我,我的用户组和该组中的用户。但是,当我试图限制subwuery,它限制所有,而不是特定的群体。
我试过,选择用户,使用IN,我的用户没有运气。
我想的可能是小组并且会有所帮助,但我无法看到我如何使用它。
所以我的问题是,如何在MySQL中限制子查询结果,其中子查询是基于查询结果构建的。
我认为我超负荷,也许我什么都看不到。
更新以显示我真正想要完成的另一段代码。
SELECT g_id FROM group_user WHERE user_id = 112
所以我得到了用户所在的所有组,比如每个选择是var extra_group,所以第二个查询将是
SELECT u_id FROM group_user WHERE group_id = extra_group LIMIT 10
我需要在一个查询中执行与上面相同的操作。
MIKE发布后的另一个更新。 我应该补充一点,用户可以在一个以上的组中。所以我认为真正的问题是,我不知道如何选择这些组,并且在同一查询中为所选组选择10个用户,因此结果可能是
g_id u_id
1 | 2
1 | 3
1 | 4
3 | 3
3 | 8
其中g_id是来自该查询的用户组
SELECT g_id FROM group_user WHERE user_id = 112
答案 0 :(得分:1)
创建样本表并添加数据:
CREATE TABLE `group_user` (
`u_id` int(11) DEFAULT NULL,
`g_id` int(11) DEFAULT NULL,
`apply_date` date DEFAULT NULL
);
CREATE TABLE `group_name` (
`g_id` int(11) DEFAULT NULL,
`g_name` varchar(255) DEFAULT NULL
);
INSERT INTO `group_name` VALUES
(1, 'Group 1'), (2, 'Group 2'), (3, 'Group 3'), (4, 'Group 4'), (5, 'Group 5');
INSERT INTO `group_user` VALUES
(1, 1, '2010-12-01'), (1, 2, '2010-12-01'), (1, 3, '2010-12-01'), (1, 4, '2010-12-01'), (1, 5, '2010-12-01'),
(2, 1, '2010-12-02'), (2, 2, '2010-12-02'),
(3, 1, '2010-12-03'), (3, 2, '2010-12-03'), (3, 3, '2010-12-03'), (3, 4, '2010-12-03'),
(4, 1, '2010-12-04'), (4, 2, '2010-12-04'),
(5, 1, '2010-12-05'), (5, 2, '2010-12-05'),
(6, 1, '2010-12-06'), (6, 2, '2010-12-06'),
(7, 1, '2010-12-07'), (7, 2, '2010-12-07'), (7, 3, '2010-12-07'), (7, 4, '2010-12-07'), (7, 5, '2010-12-07'),
(8, 1, '2010-12-08'), (8, 2, '2010-12-08'),
(9, 1, '2010-12-09'), (9, 2, '2010-12-09'), (9, 3, '2010-12-09'), (9, 4, '2010-12-09'), (9, 5, '2010-12-09');
选择用户u_id == 1
所属的群组。然后,对于每个组,最多选择4个成员(不包括用户u_id == 1
),按降序apply_date
排序:
SELECT u3.g_id, g.g_name, u3.u_id, u3.apply_date
FROM (
SELECT
u1.g_id,
u1.u_id,
u1.apply_date,
IF( @prev_gid <> u1.g_id, @user_index := 1, @user_index := @user_index + 1 ) AS user_index,
@prev_gid := u1.g_id AS prev_gid
FROM group_user AS u1
JOIN (SELECT @prev_gid := 0, @user_index := NULL) AS vars
JOIN group_user AS u2
ON u2.g_id = u1.g_id
AND u2.u_id = 1
AND u1.u_id <> 1
ORDER BY u1.g_id, u1.apply_date DESC, u1.u_id
) AS u3
JOIN group_name AS g ON g.g_id = u3.g_id
WHERE u3.user_index <= 4
ORDER BY u3.g_id, u3.apply_date DESC, u3.u_id;
+------+---------+------+------------+
| g_id | g_name | u_id | apply_date |
+------+---------+------+------------+
| 1 | Group 1 | 5 | 2010-12-05 |
| 1 | Group 1 | 4 | 2010-12-04 |
| 1 | Group 1 | 3 | 2010-12-03 |
| 1 | Group 1 | 2 | 2010-12-02 |
| 2 | Group 2 | 5 | 2010-12-05 |
| 2 | Group 2 | 4 | 2010-12-04 |
| 2 | Group 2 | 3 | 2010-12-03 |
| 2 | Group 2 | 2 | 2010-12-02 |
| 3 | Group 3 | 9 | 2010-12-09 |
| 3 | Group 3 | 7 | 2010-12-07 |
| 3 | Group 3 | 3 | 2010-12-03 |
| 4 | Group 4 | 9 | 2010-12-09 |
| 4 | Group 4 | 7 | 2010-12-07 |
| 4 | Group 4 | 3 | 2010-12-03 |
| 5 | Group 5 | 9 | 2010-12-09 |
| 5 | Group 5 | 7 | 2010-12-07 |
+------+---------+------+------------+