在 MARIADB 的另一个字段中使用选定的值

Using a selected value in another field in MARIADB

我有疑问:

SELECT  busCode, address, current.position-1 as position, movingbus.bus as bus,
        current.linea as line, destination, current.paletta as 'end',
        previous.paletta as 'start', previous.lapseToNext, current.ident,
        movingbus.latitude, movingbus.longitude,
        SQRT(POW(movingbus.latitude-41.717149, 2) + 
             POW(movingbus.longitude-12.312499,2)) as distance, 
        ROUND(distance*80) as `time`,
        current.previous as previous
    FROM  striscie as current, striscie as previous, movingbus,
        linee, palette
    WHERE  palette.number=current.paletta
      AND  current.linea=line
      AND  current.previous=previous.ident
      AND  current.ident=movingbus.striscia
    HAVING  distance<0.01 

我在其中计算距离,然后计算距离的时间:相关部分是:

SQRT(POW(movingbus.latitude-41.717149,2)+
     POW(movingbus.longitude-12.312499,2)) as distance,
ROUND(distance*80) as `time`

然而我执行的时候,MariaDB报错:

Unknown column 'distance' in 'field list'

如果我反过来用 'time' 文件中的 'distance' 替换生成它的完整操作:

SQRT(POW(movingbus.latitude-41.717149,2)+
     POW(movingbus.longitude-12.312499,2)) as distance,
ROUND(SQRT(POW(movingbus.latitude-41.717149,2)+
           POW(movingbus.longitude-12.312499,2))*80) as `time`

我没有收到任何错误。但是我当然会得到一个非常大且可能效率低下的查询。如何将 select 返回的字段用作同一 select 中操作的参数?

方案A:

@dist := SQRT(...) AS distance,
ROUND(@dist*80) as `time`,

计划 B:在子查询中计算距离(以及许多其他值),然后在外部查询中使用 distance 两次。

对于这个案例,A方案简单有效。如果有 GROUP BY,它可能根本不起作用。

B 计划在 这种 情况下效率不高,但在到达 distance<0.1 之前不必携带一堆东西可能会带来很大的性能优势.我在一个小时前讨论过这个问题: 使用该技术可以提高性能,而不是从计划 A 中获得的性能。

正确:查询变为:

SELECT  busCode, address, current.position-1 as position, movingbus.bus as bus,
    current.linea as line, destination, current.paletta as 'end',
    previous.paletta as 'start', previous.lapseToNext, current.ident,
    movingbus.latitude, movingbus.longitude,
    @dist := SQRT(POW(movingbus.latitude-41.717149, 2) + 
         POW(movingbus.longitude-12.312499,2)) as distance, 
    ROUND(@dist*80) as `time`,
    current.previous as previous
FROM  striscie as current, striscie as previous, movingbus,
    linee, palette
WHERE  palette.number=current.paletta
  AND  current.linea=line
  AND  current.previous=previous.ident
  AND  current.ident=movingbus.striscia
HAVING  distance<1 

果然有效,非常感谢。