MYSQL 插入 select 个过滤字段
MYSQL Insert into select filtering fields
我必须在 table1 中为在 table2 中找到的每一行插入一个新行。
问题是 table2 returns 中的 select 比插入所需的字段多,但在 select.
的 where 子句中很有用
此查询根据他们的(商店)范围(在 table 商店中定义)向用户显示周围的所有商店
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;
现在我必须将这些结果放入具有此结构的table
user_id INTEGER
poi_id INTEGER
ins_date TIMESTAMP (CURRENT TIMESTAMP)
我不知道怎么做,你能帮我吗?
INSERT INTO table (user_id, poi_id)
SELECT ... ? (too many fields in select)
略读字里行间,但基本上只包括您在插入 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;
您只需要添加 select user_id 并删除距离和范围,因为 table 中没有,实际上您必须添加 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;
如果您需要在 table 中添加日期,请将此字段包含在括号中并放入 select 语句中
我必须在 table1 中为在 table2 中找到的每一行插入一个新行。 问题是 table2 returns 中的 select 比插入所需的字段多,但在 select.
的 where 子句中很有用此查询根据他们的(商店)范围(在 table 商店中定义)向用户显示周围的所有商店
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;
现在我必须将这些结果放入具有此结构的table
user_id INTEGER
poi_id INTEGER
ins_date TIMESTAMP (CURRENT TIMESTAMP)
我不知道怎么做,你能帮我吗?
INSERT INTO table (user_id, poi_id)
SELECT ... ? (too many fields in select)
略读字里行间,但基本上只包括您在插入 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;
您只需要添加 select user_id 并删除距离和范围,因为 table 中没有,实际上您必须添加 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;
如果您需要在 table 中添加日期,请将此字段包含在括号中并放入 select 语句中