0

我有一个我不明白的问题;为什么不能使用列?这是我的代码:

SELECT `a`.`id`, `a`.`title`, `e`.`url` as category, 
  calc_val(`a`.`value`, `c`.`prof`, `c`.`tax`) as general, 
  `a`.`date`, `a`.`url`, 
  SUM(`d`.`stock`) as stock 
FROM (`produc` as a) 
LEFT JOIN `prod_c` as b ON `a`.`id` = `b`.`p_id` 
LEFT JOIN `p_calc` as c ON `a`.`id` = `c`.`p_id` 
LEFT JOIN `p_opt` as d ON `a`.`id` = `d`.`p_id` 
LEFT JOIN `categ` as e ON `b`.`categ_id` = `e`.`id` 
LEFT JOIN `prod_aval` as `f` ON `a`.`id` = `f`.`p_id` 
WHERE `b`.`categ_id` = '1' 
  AND `a`.`active` = 'y' 
  AND `d`.`stock` >= 1 
  AND general BETWEEN '10' AND '50' 
GROUP BY `a`.`id` 
LIMIT 9

calc_val = routine:

begin
    declare value real;
    set value = v+(v*l/100);
    return value+(value*i/100);
end
4

2 回答 2

2

别名不能在 WHERE 子句中使用,因此您需要包含计算:

AND calc_val(`a`.`value`, `c`.`prof`, `c`.`tax`) BETWEEN '10' AND '50'

或者,您可以使用派生表并将部分或全部 WHERE 子句应用于它。如果计算成本高昂/复杂/处理器密集,这可能很有用。

SELECT * FROM (
    SELECT `a`.`id`, `a`.`title`, `e`.`url` as category, 
      calc_val(`a`.`value`, `c`.`prof`, `c`.`tax`) as general, 
      `a`.`date`, `a`.`url`, 
      SUM(`d`.`stock`) as stock 
    FROM (`produc` as a) 
    LEFT JOIN `prod_c` as b ON `a`.`id` = `b`.`p_id` 
    LEFT JOIN `p_calc` as c ON `a`.`id` = `c`.`p_id` 
    LEFT JOIN `p_opt` as d ON `a`.`id` = `d`.`p_id` 
    LEFT JOIN `categ` as e ON `b`.`categ_id` = `e`.`id` 
    LEFT JOIN `prod_aval` as `f` ON `a`.`id` = `f`.`p_id` 
    WHERE `b`.`categ_id` = '1' 
      AND `a`.`active` = 'y' 
      AND `d`.`stock` >= 1 
    GROUP BY `a`.`id` 
    LIMIT 9
)
WHERE general BETWEEN '10' AND '50'
于 2013-06-07T17:40:24.593 回答
0

如果您使用 MySql Server 5.5+ 版,术语“GENERAL”是一个保留字。查看此页面以了解更多信息: http ://dev.mysql.com/doc/refman/5.5/en/reserved-words.html#table-reserved-words-new-5.5

HTH,安迪

于 2013-06-07T17:17:19.033 回答