Select 选择具有联接或子查询限制的语句
几天来我一直在努力解决这个问题。 我有表组用户,组名称。 我想做的是选择用户组,而不是从组名称中描述该组,以及从该组中选择10个其他用户 前两个没问题。问题是,我没有地方去限制用户 我可以选择用户组和该组中的其他用户。我不知道如何限制它。 使用: 它显示了我、我的用户组和该组中的用户。但当我试图限制在郊区时,它限制了所有人,而不是特定的群体 我尝试了,选择用户,并在where is goups of my user with luck中使用 我在想,也许团体和聚会会有帮助,但我看不出我能如何利用它 所以我的问题是,如何在MySQL中限制子查询结果,因为子查询是基于查询结果构建的 我想我超负荷了,也许我看不到什么 更新以显示我真正想要完成的任务这里是另一段代码Select 选择具有联接或子查询限制的语句,select,mysql,Select,Mysql,几天来我一直在努力解决这个问题。 我有表组用户,组名称。 我想做的是选择用户组,而不是从组名称中描述该组,以及从该组中选择10个其他用户 前两个没问题。问题是,我没有地方去限制用户 我可以选择用户组和该组中的其他用户。我不知道如何限制它。 使用: 它显示了我、我的用户组和该组中的用户。但当我试图限制在郊区时,它限制了所有人,而不是特定的群体 我尝试了,选择用户,并在where is goups of my user with luck中使用 我在想,也许团体和聚会会有帮助,但我看不出我能如何利用
SELECT g_id FROM group_user WHERE user_id = 112
所以我得到了用户在let中的所有组,也就是说,每个select都是var extra_组,所以第二个查询是
SELECT u_id FROM group_user WHERE group_id = extra_group LIMIT 10
我需要在一个查询中执行与上面相同的操作
MIKE post之后的另一个更新。
我应该补充一点,用户可以在多个组中。所以我认为真正的问题是,我不知道如何选择这些组,在同一个查询中为所选组选择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
创建示例表并添加数据:
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),按应用日期降序排列:
您是否关心它为每个组抽取的10个用户?是的,它必须是最后10个:按应用日期排序描述我想我应该添加-用户可以在多个组中。对于每个组,我需要选择10个最新用户,我认为真正的问题是,我不知道如何选择这些组,在同一个查询中,为所选组选择10个用户。但是非常感谢上面的代码:哦,我真的很感激。对不起我的英语;幸运的是,子查询可以返回多行,因此使用=不工作:o@Karoline:我添加了我认为可能的解决方案。几乎,我运行了它,但子查询中的限制限制了组选择的数量,而不是用户。当您按g_名称或g_id添加订单时,您会看到,对于一个组,它所占用的时间超过了限制3,但只有用户所在的3个组。当然,当我们在最后加上限制时,这也不是我们想要的。我想可能是g_id从组用户中选择g_id,其中u_id=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');
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 |
+------+---------+------+------------+