选择带有连接或子查询限制的语句

时间:2010-12-05 10:00:04

标签: select mysql

现在几天我都试图解决这个问题。 我有表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 

1 个答案:

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