在 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
果然有效,非常感谢。
我有疑问:
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
果然有效,非常感谢。