0

我必须在 table1 中为 table2 中找到的每一行插入一个新行。问题是 table2 中的 select 返回的字段多于插入所需的字段,但在 select 的 where 子句中很有用。

此查询根据他们的 (shops) 范围(在表 stores 中定义)向用户显示周围的所有商店

SELECT destination.poi_id,
  6371 * 
     2 * 
     ASIN(
       SQRT(
         POWER(SIN((use_lat - poi_lat) * PI()/180 / 2), 2) +
         COS(use_lat * pi()/180) * 
         COS(poi_lat * pi()/180) *
         POWER(SIN((use_lon - poi_lon) * PI()/180 / 2), 2)
       )
     ) AS distance,
  destination.poi_range AS range
FROM stores destination, users origin
WHERE origin.use_id=userid
  AND destination.poi_lon BETWEEN lon1 AND lon2
  AND destination.poi_lat BETWEEN lat1 AND lat2
  HAVING distance <= range
ORDER BY distance;

现在我必须将这些结果放在具有这种结构的表中

user_id  INTEGER
poi_id   INTEGER
ins_date TIMESTAMP (CURRENT TIMESTAMP)

我不知道该怎么做,你能帮帮我吗?

INSERT INTO table (user_id, poi_id)
SELECT ... ? (too many fields in select)
4

2 回答 2

1

稍微阅读一下行间,但基本上只包括插入 IE 中需要的列:

INSERT INTO table (user_id, poi_id)
SELECT use_id,poi_id,NOW() FROM
    (SELECT origin.use_id,destination.poi_id,6371 * 
     2 * 
     ASIN(
       SQRT(
         POWER(SIN((use_lat - poi_lat) * PI()/180 / 2), 2) +
         COS(use_lat * pi()/180) * 
         COS(poi_lat * pi()/180) *
         POWER(SIN((use_lon - poi_lon) * PI()/180 / 2), 2)
       )
     ) as distance
    FROM stores destination, users origin
    WHERE origin.use_id=userid
      AND destination.poi_lon BETWEEN lon1 AND lon2
      AND destination.poi_lat BETWEEN lat1 AND lat2
      HAVING distance <= range) sub1
ORDER BY distance;
于 2015-05-19T08:53:26.520 回答
0

您只需要添加您的选择 user_id 并删除距离和范围,因为您的表中没有,实际上您必须添加 ins_date 因为您没有在插入中定义VALUE语句。所以你的 Select 应该是这样的

INSERT INTO table values (user_id, poi_id) 
   Select user_id, poi_id from FROM stores destination, users origin
WHERE origin.use_id=userid
  AND destination.poi_lon BETWEEN lon1 AND lon2
  AND destination.poi_lat BETWEEN lat1 AND lat2
  HAVING distance <= range
ORDER BY distance;

如果您需要在表格中添加日期,请将此字段包含在括号中并包含在 select 语句中

于 2015-05-19T08:58:09.087 回答