Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Select 选择具有联接或子查询限制的语句_Select_Mysql - Fatal编程技术网

Select 选择具有联接或子查询限制的语句

Select 选择具有联接或子查询限制的语句,select,mysql,Select,Mysql,几天来我一直在努力解决这个问题。 我有表组用户,组名称。 我想做的是选择用户组,而不是从组名称中描述该组,以及从该组中选择10个其他用户 前两个没问题。问题是,我没有地方去限制用户 我可以选择用户组和该组中的其他用户。我不知道如何限制它。 使用: 它显示了我、我的用户组和该组中的用户。但当我试图限制在郊区时,它限制了所有人,而不是特定的群体 我尝试了,选择用户,并在where is goups of my user with luck中使用 我在想,也许团体和聚会会有帮助,但我看不出我能如何利用

几天来我一直在努力解决这个问题。 我有表组用户,组名称。 我想做的是选择用户组,而不是从组名称中描述该组,以及从该组中选择10个其他用户

前两个没问题。问题是,我没有地方去限制用户

我可以选择用户组和该组中的其他用户。我不知道如何限制它。 使用:

它显示了我、我的用户组和该组中的用户。但当我试图限制在郊区时,它限制了所有人,而不是特定的群体

我尝试了,选择用户,并在where is goups of my user with luck中使用

我在想,也许团体和聚会会有帮助,但我看不出我能如何利用它

所以我的问题是,如何在MySQL中限制子查询结果,因为子查询是基于查询结果构建的

我想我超负荷了,也许我看不到什么

更新以显示我真正想要完成的任务这里是另一段代码

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 |
+------+---------+------+------------+