我的mysql查询中存在限制条件错误

我的mysql查询中存在限制条件错误,mysql,sql,phpmyadmin,mysql-workbench,Mysql,Sql,Phpmyadmin,Mysql Workbench,我有三张桌子 客户、时代与销售 我想了解所有客户的年收入情况,条件是没有孩子的客户和收入必须大于我们设定的限额 我的桌子结构 顾客 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` var

我有三张桌子 客户、时代与销售 我想了解所有客户的年收入情况,条件是没有孩子的客户和收入必须大于我们设定的限额 我的桌子结构 顾客

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;
销售

时代

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

我的问题是

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子句中的未知列income是别名,所以不能在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 

对于原始表中不存在的aggreagte列,应使用having子句而不是where


您别名为收入的数量是一个合计,因此在WHERE子句中引用它是没有意义的。将此WHERE逻辑移到HAVING子句:

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

但这无法移植到大多数其他数据库。此外,我在查询中引入了别名,这使它更易于阅读

查找无子女和年收入的客户名单 大于运行查询时用户给定的限制

您确定不需要这样一个简单的查询吗

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

当您使用mysql时,我已经删除了sql server标记。请不要给未涉及的产品贴标签。应该是年收入而不是收入。没有这样一个字段,年收入计算为ROUNDSUMsales。商店销售计算为收入。我希望在这个条件下,为什么年收入是varchar?它不起作用。因为所选列表不在GROUP BY子句中。@the.salman.a实际上是这样的,MySQL允许在HAVE子句中使用聚合列的别名,例如与不允许它的Oracle进行比较。这部分没问题,我指的是所选列表。它将给出此选择列表不在GROUP BY子句中,并且包含未聚合列“image_processing.customers.fname”,该列在功能上不依赖GROUP BY子句中的列;这与sql\u mode=only\u full\u组不兼容_by@the.salman.a从错误中可以看出,在您设置的SQL模式或会话中默认设置的SQL模式下,不允许使用该错误。改变SQL模式将解决这个问题,因为MySQL允许在选择列表中使用非聚合列,尽管它开始阻止使用。是的。那也在那里。你明白了。没有年度收入字段当然有,至少在你发布的创建表customers:-,抱歉,是的。那么我们如何找到它?“年收入”字段是一个varchar字段,其中的数据类似于$30K-$50K。例如,子字符串“U索引”$30K-$50K',“-”,1从客户处返回“$30K。选择子字符串“U索引年收入”,-”,-1
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 
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 
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 income > @limit;
SELECT *
FROM customers AS c 
WHERE yearly_income > @limit  -- but why is yearly_income a VarChar(50)?
AND total_children=0