Php 为什么在下面的sql查询中价格列是未知的?

Php 为什么在下面的sql查询中价格列是未知的?,php,mysql,sql,Php,Mysql,Sql,我有以下表格结构: Course(course_id, course_name, language, course_price, create_date, average_rating, category, course_description, certificate_price, course_creator_id) Person(person_id, username, email, name, surname, password, date_of_birth) Discount(di

我有以下表格结构:

Course(course_id, course_name, language, course_price, create_date, average_rating, category, course_description, certificate_price, course_creator_id)

Person(person_id, username, email, name, surname, password, date_of_birth)

Discount(discount_id, discounted_course_id, allower_course_creator_id, is_allowed, start_date, end_date, percentage)
当我试图筛选价格>=10的课程时,我写了价格>=10,因为在SELECT子句中,有一个以AS price结尾的CASE-ELSE语句

当我查询此字符串时,为什么在“where子句”错误中得到未知列“price”

SELECT C.course_id, C.course_name, C.language, C.average_rating, 
       C.category, P.name, P.surname, D.percentage, 
       D.start_date, D.end_date, D.is_allowed, 
      (CASE WHEN CURRENT_DATE <= D.end_date AND CURRENT_DATE >= D.start_date AND D.is_allowed THEN 
      C.course_price * (( 100 - D.percentage ) / 100) ELSE C.course_price END) as price 
FROM course C LEFT OUTER JOIN discount D ON C.course_id = D.discounted_course_id 
              LEFT JOIN person P ON 
              C.course_creator_id = P.person_id WHERE price >= 10 
              AND average_rating >= '30' AND average_rating <= '40' AND language = 'English' 
              AND category = 'Finance'

我想根据价格进行过滤,但是,通过这种方式,我得到了错误。

这里价格是select子句中别名的名称。按照Mysql子句执行顺序,where子句将在select子句之前执行。
即,在执行where子句时,不会定义价格,因此where子句不知道价格。在这种情况下,您可以使用having子句而不是where子句,因为having子句将在select子句之后执行。

此处Price是select子句中别名的名称。按照Mysql子句执行顺序,where子句将在select子句之前执行。 即,在执行where子句时,不会定义价格,因此where子句不知道价格。在这种情况下,您可以使用having子句而不是where子句,因为having子句将在select子句之后执行。

您不能在where子句中使用price,因为它是在select子句中定义的

传统的SQL解决方案是子查询、CTE或MySQL尚不支持的横向连接。但是,MySQL提供了另一种解决方案,即即使查询不是聚合查询,也使用HAVING子句:

您不能在WHERE子句中使用price,因为它是在SELECT中定义的

传统的SQL解决方案是子查询、CTE或MySQL尚不支持的横向连接。但是,MySQL提供了另一种解决方案,即即使查询不是聚合查询,也使用HAVING子句:


提示:提示2:MySQL特殊技巧,对列别名条件使用HAVING子句。提示2:MySQL特殊技巧,对列别名条件使用HAVING子句。是否有可能在堆栈溢出上已经存在此建议…您自己已经提供了使用HAVING的确切细节?您能否通过整合相关/相同的内容帮助Stack Overflow成为更好的资源?这是SME在帮助堆栈溢出方面最强大的地方。是否有可能在堆栈溢出方面已经存在此建议…您自己已经提供了使用have的确切见解?您能否通过整合相关/相同的内容帮助Stack Overflow成为更好的资源?这是SME在帮助堆栈溢出方面最强大的地方。
SELECT C.course_id, C.course_name, C.language, C.average_rating, 
       C.category, P.name, P.surname, D.percentage, 
       D.start_date, D.end_date, D.is_allowed, 
      (CASE WHEN CURRENT_DATE <= D.end_date AND CURRENT_DATE >= D.start_date AND D.is_allowed
            THEN C.course_price * (( 100 - D.percentage ) / 100)
            ELSE C.course_price
       END) as price 
FROM course C LEFT OUTER JOIN
     discount D
     ON C.course_id = D.discounted_course_id LEFT JOIN
     person P
     ON C.course_creator_id = P.person_id
WHERE average_rating >= '30' AND average_rating <= '40' AND
      language = 'English' AND category = 'Finance'
HAVING price >= 10;
WHERE average_rating >= 30 AND average_rating <= 40 AND
      language = 'English' AND category = 'Finance'