Mysql根据列的值限制结果

时间:2018-04-12 13:29:59

标签: php mysql

我正在尝试根据另一个表列限制查询结果的数量。例如,我有一个产品表和一个配置表,如下所示:

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

2 个答案:

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