DELETE

时间:2016-07-04 01:55:44

标签: mysql sql

我有以下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命令没用。我不知道如何编辑它。

2 个答案:

答案 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)