MySQL根据连接表

时间:2017-06-13 12:15:20

标签: mysql

我有两个表,第一个包含一个限制列。必须使用此列中的数字来限制从第二个表接收的记录数。

是否可以只在一个查询中执行此操作?

在我的表格下面DEMO

# Create table a
CREATE TABLE `a` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `limit` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

# Create table b
CREATE TABLE `b` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `master` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

# Fill table a
INSERT INTO `a` (`id`, `limit`)
VALUES
    (1, 3);


# Fill table b
INSERT INTO `b` (`id`, `name`, `master`)
VALUES
    (1, 'record 1', 'groupA'),
    (2, 'record 2', 'groupB'),
    (3, 'record 3', 'groupA'),
    (4, 'record 4', 'groupB'),
    (5, 'record 5', 'groupC'),
    (6, 'record 6', 'groupC'),
    (7, 'record 7', 'groupC'),
    (8, 'record 8', 'groupA'),
    (9, 'record 9', 'groupD'),
    (10, 'record 10', 'groupD');

我测试的查询:

SELECT b.*
FROM b
JOIN a ON a.id = 1
GROUP BY b.master
LIMIT 3

这仅选择3条记录。

但现在我希望从表a中读取限制。我试图像这样限制,但那失败了:

SELECT b.*
FROM b
JOIN a ON a.id = 1
GROUP BY b.master
LIMIT a.limit

编辑: 我已经更新了问题,包括group by声明

1 个答案:

答案 0 :(得分:1)

您不能在b子句中使用用户定义的MySQL变量或表字段。你可以做的是使用一个变量来枚举表SELECT t.id, t.name FROM ( SELECT id, name, @rn := @rn + 1 AS rn FROM b CROSS JOIN (SELECT @rn := 0) AS v ORDER BY id) AS t INNER JOIN a ON a.id = 1 AND t.rn <= a.`limit`; 的记录。然后使用此变量应用限制:

b

Demo here

修改

这是一个处理群组的版本。它将SELECT b.id, b.name, b.master FROM b INNER JOIN ( SELECT master, @rn := @rn + 1 AS rn FROM b CROSS JOIN (SELECT @rn := 0) AS v GROUP BY master ORDER BY COUNT(*) DESC) AS t ON b.master = t.master INNER JOIN a ON a.id = 1 AND t.rn <= a.`limit`; 的记录限制为人口最多的群体:

-Djava.security.egd=/dev/./urandom -Djava.awt.headless=true -Xmx1024m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC

Demo here