我正在尝试根据另一个表列限制查询结果的数量。例如,我有一个产品表和一个配置表,如下所示:
tb_product
id | active | name | value | ...
tb_config
max_product | ...
我想做的是这样的事情
SELECT
a.name, a.value
FROM
tb_product a,
tb_config b
WHERE a.active = 1
LIMIT b.max_product
但是我收到了像#1327 - Undeclared variable: b
这样的错误。有没有办法实现这个结果?
因为目前我正在做的是做另一个查询来获取max_product值,然后将其用作php变量来限制结果,如下所示:
$limit = "SELECT max_product FROM tb_config";
SELECT name, value FROM tb_product WHERE ativo = 1 LIMIT $limit
答案 0 :(得分:0)
...也许
SELECT a.name
, a.value
FROM tb_product a
CROSS JOIN (SELECT @Limit:=(SELECT max_product from tb_config))
WHERE a.active = 1
LIMIT @Limit
答案 1 :(得分:0)
在Variable LIMIT Clause in MySQL的@ ENargit答案的帮助下,您可以使用行计数变量来完成。
假设以下架构:
CREATE TABLE
tb_product
(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(10),
`value` VARCHAR(10)
);
INSERT INTO
`tb_product`
(`name`, `value`)
VALUES
('Name1','Value1'),
('Name2','Value2'),
('Name3','Value3'),
('Name4','Value4'),
('Name5','Value5'),
('Name6','Value6'),
('Name7','Value7'),
('Name8','Value8'),
('Name9','Value9'),
('Name10','Value10');
CREATE TABLE
`tbl_config`
(
id INT PRIMARY KEY AUTO_INCREMENT,
`type` VARCHAR(10),
`value` INT
);
INSERT INTO
`tbl_config`
(`type`,`value`)
VALUES
('something',10),
('maxrows',7);
您可以使用子查询引用配置表:
SELECT * FROM (
SELECT
tb_product.*,
@rownum := @rownum + 1 AS RowNum
FROM tb_product,
(SELECT @rownum := 0) AS CounterTbl
) AS DataTbl
WHERE
RowNum <= (
SELECT
`value`
FROM
`tbl_config`
WHERE
`type` = 'maxrows'
);
给你前7行(根据配置值)。您显然可以将其扩展为进行排序等。
SQLFiddle:http://www.sqlfiddle.com/#!9/f789e4/2