mysql 如何在WHERE子句中使用SELECT中创建的变量

b4lqfgs4  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(176)

我有点纠结于如何在WHERE子句中使用SELECT查询中创建的变量,每当我试图使用它来过滤一些数据时,where子句都不知道我的变量是什么。下面是查询:

SELECT a.credit,
       a.disDate,a.id, -t.price, at.tagID,
       @first_month_days := DAY(LAST_DAY(a.disDate)) as firstMonthDays,
       @first_month_day := DAY(a.disDate) as firstMonthDay,
       @first := t.price/@first_month_days*(@first_month_days-@first_month_day) as firstMonthDayBill,
       @second_month_days := DAY(last_day(date_add(a.disDate, interval @first_month_days-@first_month_day + 1 day))) as nextMonthDays,
       @second := t.price/@second_month_days*(IF(40-(@first_month_days - @first_month_day) > @second_month_days,@second_month_days,40 - (@first_month_days - @first_month_day))) as secondMonthDayBill,
       @third_month_days := DAY(last_day(date_add(a.disDate, interval @first_month_days-@first_month_day + @second_month_days + 1 day ))) as thirdMonthDays,
       @third := IF(40 - (@first_month_days - @first_month_day) > @second_month_days,t.price/@third_month_days*(40 - ((@first_month_days-@first_month_day)+@second_month_days)),0) as thirdMonthDayBill,
       a.balance,
       @sum := @second+@first+@third
        FROM ns_accounts a
        INNER JOIN ns_tariffs t ON
        a.tariffID = t.id
        INNER JOIN ns_accounts_tags at ON
        a.id = at.aID
        AND at.tagID IN (13)
        where a.credit is not null and a.disDate is not null and  statusID = 1 and @sum > 0

我可以说得简单点:

SELECT 
       @first := DAY(LAST_DAY(a.number)),
       @second := DAY(LAST_DAY(a.differentNumber))
      
       @sum := @second+@first
        FROM accounts a
        
        where @sum > 0

在select查询中简单地创建一个变量,并且能够在where子句中使用它的最佳方法是什么?提前感谢您

zdwk9cvp

zdwk9cvp1#

在SQL中,不能在查询的选择列表中创建任何表达式,并在同一查询的WHERE子句中引用它。尽管选择列表表达式首先出现在查询语法中,但直到WHERE子句应用了行限制之后才计算它们。
这适用于用户定义的变量和别名。
解决方法是在子查询中计算表达式,然后在外部查询中引用它们。

SELECT t2.`first`, t2.`second`, t2.`sum`
FROM (
    SELECT t1.`first`, t1.`second`, t1.`second`+t1.`first` as `sum` 
    FROM (
        SELECT 
           DAY(LAST_DAY(a.number)) as `first`,
           DAY(LAST_DAY(a.differentNumber)) as `second`
        FROM accounts a
    ) AS t1
) AS t2
WHERE t2.`sum` > 0;

在本例中,必须有两个级别的子查询。sum表达式不能在计算firstsecond表达式的同一个选择列表中引用这些表达式。同样,WHERE子句不能在计算表达式的同一查询中引用sum
使用此解决方案,不需要用户定义的变量。不鼓励在SQL查询中使用用户定义的变量,因为选择列表中的表达式不能保证从左到右进行计算。

相关问题