我有以下SQL命令,用于从表中选择附近的对象:
SELECT *,3956*2*ASIN(SQRT(POWER(SIN((49 - lat)*pi()/180/2),2)+
COS(49 * pi()/180)*COS(lat * pi()/180)*POWER(SIN((-127 -lng)*
pi()/180/2),2))) AS distance
FROM postings
HAVING distance < 5
ORDER BY distance;
哪个工作正常。但是,我想修改语句以进行删除(DELETE FROM postings WHERE distance < 5;
),但不能完全弄清楚如何这样做。 MySQL似乎有类似的语法问题:
DELETE *,3956*2*ASIN(SQRT(POWER(SIN((49 - lat)*pi()/180/2),2)+
COS(49 * pi()/180)*COS(lat * pi()/180)*POWER(SIN((-127 -lng)*
pi()/180/2),2))) as distance
FROM postings
HAVING distance < 5
ORDER BY distance;
我可以看到原因,因为DELETE
通常用于删除特定行中的列,而距离和用于创建它的AS
语句不是原始表中的列,因此对于语法中该位置的DELETE
命令没用。我不知道如何编辑它。
答案 0 :(得分:1)
基本上,这不起作用,因为delete
不支持group by
,因此也不支持having
。
一种方法是将公式移动到where
子句。另一种方法是使用join
:
DELETE p
FROM postings p JOIN
(SELECT p.*,
3956*2*ASIN(SQRT(POWER(SIN((49 - lat)*pi()/180/2),2)+
COS(49 * pi()/180)*COS(lat * pi()/180)*POWER(SIN((-127 -lng)*
pi()/180/2),2))) as distance
FROM postings
) pp
on p.id = pp.id and distance < 5;
如果您将公式放在where
中,那么它将如下所示:
DELETE postings
WHERE 3956*2*ASIN(SQRT(POWER(SIN((49 - lat)*pi()/180/2),2)+
COS(49 * pi()/180)*COS(lat * pi()/180)*POWER(SIN((-127 -lng)*
pi()/180/2),2))) < 5 ;
order by
delete
没有意义。
答案 1 :(得分:0)
使用内部选择查询获取记录ID然后将其删除 要删除记录,您可以在where子句
中添加该距离计算逻辑DELETE FROM postings where id in (SELECT postid FROM
postings where 3956*2*ASIN(SQRT(POWER(SIN((49 - lat)*pi()/180/2),2)+
COS(49 * pi()/180)*COS(lat * pi()/180)*POWER(SIN((-127 -lng)*
pi()/180/2),2))) < 5 ORDER BY distance)