Вставка MYSQL в выбранные поля фильтрации

Мне нужно вставить новую строку в таблицу1 для каждой строки, найденной в таблице2. Проблема в том, что выбор в таблице2 возвращает больше полей, чем необходимо для вставки, но они полезны в предложении where выбора.

Этот запрос показывает пользователю все магазины вокруг, основываясь на их ассортименте (магазинах) (определенном в таблице store)

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)

person Scream    schedule 19.05.2015    source источник


Ответы (2)


Немного читая между строк, но в основном включайте только те столбцы, которые вам нужны во вставке 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;
person Giles    schedule 19.05.2015
comment
где я положил расчет расстояния для условия и заказа? - person Scream; 19.05.2015
comment
Извините, пропустил расстояние. Я думаю, что проще всего здесь использовать подвыборку для выполнения предложений, а затем выбрать из них требуемые столбцы (другой альтернативой было бы поместить этот длинный расчет как в предложения HAVING, так и в предложения ORDER). См. мой измененный пост выше. - person Giles; 19.05.2015

Вам просто нужно добавить выбранный user_id и удалить расстояние и диапазон, потому что их нет в вашей таблице, и на самом деле вам нужно добавить ins_date, потому что вы не определяете оператор VALUE в своей вставке. Итак, ваш выбор должен быть примерно таким

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;

если вам нужно добавить дату в свою таблицу, включите это поле в скобки и в оператор выбора тоже

person The Reason    schedule 19.05.2015
comment
Мне нужно расстояние, поэтому я добавляю поля в таблицу. - person Scream; 19.05.2015
comment
да, вы правы, и iclude поле расстояния в вашем выборе и в скобках - person The Reason; 19.05.2015