带有限制条件的mysql查询中的错误

时间:2018-03-20 09:12:18

标签: mysql sql phpmyadmin mysql-workbench

我有3张桌子 客户,时代和销售 我想找出所有客户收入的年度条件是没有孩子和收入的客户必须大于我们设定的限额 我的桌子结构 客户

CREATE TABLE `customers` (
  `customer_id` int(11) DEFAULT NULL,
  `account_num` double DEFAULT NULL,
  `lname` varchar(50) DEFAULT NULL,
  `fname` varchar(50) DEFAULT NULL,
  `mi` varchar(50) DEFAULT NULL,
  `address1` varchar(50) DEFAULT NULL,
  `address2` varchar(50) DEFAULT NULL,
  `address3` varchar(50) DEFAULT NULL,
  `address4` varchar(50) DEFAULT NULL,
  `postal_code` varchar(50) DEFAULT NULL,
  `region_id` int(11) DEFAULT NULL,
  `phone1` varchar(50) DEFAULT NULL,
  `phone2` varchar(50) DEFAULT NULL,
  `birthdate` datetime DEFAULT NULL,
  `marital_status` varchar(50) DEFAULT NULL,
  `yearly_income` varchar(50) DEFAULT NULL,
  `gender` varchar(50) DEFAULT NULL,
  `total_children` smallint(6) DEFAULT NULL,
  `num_children_at_home` smallint(6) DEFAULT NULL,
  `education` varchar(50) DEFAULT NULL,
  `member_card` varchar(50) DEFAULT NULL,
  `occupation` varchar(50) DEFAULT NULL,
  `houseowner` varchar(50) DEFAULT NULL,
  `num_cars_owned` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

销售

CREATE TABLE `sales` (
  `product_id` int(11) DEFAULT NULL,
  `time_id` int(11) DEFAULT NULL,
  `customer_id` int(11) DEFAULT NULL,
  `store_id` int(11) DEFAULT NULL,
  `store_sales` float DEFAULT NULL,
  `store_cost` float DEFAULT NULL,
  `unit_sales` double DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `times` (
  `time_id` int(11) DEFAULT NULL,
  `the_date` datetime DEFAULT NULL,
  `the_day` varchar(50) DEFAULT NULL,
  `the_month` varchar(50) DEFAULT NULL,
  `the_year` smallint(6) DEFAULT NULL,
  `day_of_month` smallint(6) DEFAULT NULL,
  `month_of_year` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我的问题是: - 查找没有孩子的客户列表,并且year_income大于用户在运行查询时给出的限制。

我的查询

SET @limit=50;
SELECT customers.`fname`, customers.`lname` ,ROUND(SUM(sales.store_sales)) as income,times.the_year
 FROM `sales` 
 LEFT JOIN times
 ON sales.time_id=times.time_id
 LEFT JOIN customers 
ON customers.customer_id=sales.customer_id 
WHERE income>@limit AND `total_children`=0
GROUP BY sales.customer_id,times.the_year 

我收到此错误:#1054 - 'where子句'中的未知列'收入'

4 个答案:

答案 0 :(得分:2)

作为income别名的数量是一个聚合,因此在WHERE子句中引用它是没有意义的。将此WHERE逻辑移至HAVING子句:

SET @limit=50;
SELECT
    c.fname,
    c.lname,
    ROUND(SUM(s.store_sales)) AS income,
    t.the_year
FROM sales s 
LEFT JOIN times t
    ON s.time_id = t.time_id
LEFT JOIN customers c
    ON c.customer_id = s.customer_id 
WHERE
    total_children = 0
GROUP BY
    c.customer_id,
    t.the_year 
HAVING
    ROUND(SUM(s.store_sales)) > @limit;

请注意,从技术上讲,我们可以使用HAVING子句中的别名:

HAVING income > @limit;

但这对大多数其他数据库来说都不可移植。此外,我在查询中引入了别名,这使得它更容易阅读。

答案 1 :(得分:1)

对于原始表中没有的aggreagte列,您应该使用having子句而不是where

SET @limit=50;
SELECT customers.`fname`, customers.`lname` ,ROUND(SUM(sales.store_sales)) as income,times.the_year
 FROM `sales` 
 LEFT JOIN times
 ON sales.time_id=times.time_id
 LEFT JOIN customers 
ON customers.customer_id=sales.customer_id 
WHERE `total_children`=0
GROUP BY customers.customer_id,times.the_year 
having income>@limit 

答案 2 :(得分:0)

收入是别名,所以不能在where where条件下使用。

SET @limit=50;
SELECT * FROM
(
SELECT customers.`fname`, customers.`lname` ,ROUND(SUM(sales.store_sales)) 
       as income,times.the_year
FROM `sales` LEFT JOIN times ON sales.time_id=times.time_id
             LEFT JOIN customers ON customers.customer_id=sales.customer_id 
WHERE  `total_children`=0
GROUP BY sales.customer_id,times.the_year 
)t WHERE income>@limit 

答案 3 :(得分:0)

  

查找没有孩子和年度收入的客户列表   大于运行查询时用户给出的限制。

您确定不想要这样的简单查询吗?

SELECT *
FROM customers AS c 
WHERE yearly_income > @limit  -- but why is yearly_income a VarChar(50)?
AND total_children=0