2015-05-19 3 views
0

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

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

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) 

ответ

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; 
+0

где я поставил расчет расстояния для условия и упорядоченности? – Scream

+0

Извините, пропустил дистанцию. Я думаю, что проще всего использовать дополнительный select для выполнения предложений, а затем выбрать из него необходимые столбцы (другой вариант - разместить этот длинный вырез в предложениях HAVING и ORDER). См. Мой измененный пост выше. – Giles

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; 

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

+0

Мне нужно расстояние, поэтому я добавляю поля в таблицу. – Scream

+0

да, вы правы, и поле расстояния iclude в вашем выборе и в скобках –

Смежные вопросы