#mysql
#mysql
Вопрос:
Мне нужна помощь в том, чтобы объединить эти два запроса в один запрос. например, я хочу выполнить поиск в базе данных для поездок, которые соответствуют радиусу $ sql и радиусу $ sql2, и получить результаты, соответствующие обоим.
$sql = "SELECT adpastrip_id,
( 3959 * acos( cos( radians($lat) ) * cos( radians( lat1 ) ) * cos( radians( long1 ) - radians($lng) ) sin( radians($lat) ) * sin( radians( lat1 ) ) ) ) AS distance
FROM addgoodstrip
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 20";
$sql2 = "SELECT adpastrip_id,
( 3959 * acos( cos( radians($lat2) ) * cos( radians( lat2 ) ) * cos( radians( long2 ) - radians($lng2) ) sin( radians($lat2) ) * sin( radians( lat2 ) ) ) ) AS distance
FROM addgoodstrip
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 20 ";
Ответ №1:
Вам не нужно соединение, все, что вам нужно сделать, это произвести 2 вычисления в одном запросе
$sql = "SELECT adpastrip_id,
( 3959 * acos( cos( radians($lat) ) * cos( radians( lat1 ) ) * cos( radians( long1 ) - radians($lng) ) sin( radians($lat) ) * sin( radians( lat1 ) ) ) )
AS distance1,
( 3959 * acos( cos( radians($lat2) ) * cos( radians( lat2 ) ) * cos( radians( long2 ) - radians($lng2) ) sin( radians($lat2) ) * sin( radians( lat2 ) ) ) )
AS distance2
FROM addgoodstrip
HAVING distance < 10
ORDER BY distance1
LIMIT 0 , 20";
Который выдаст результирующий набор, подобный
adpastrip_id distance1 distance2
1 100 120
2 90 88
Ответ №2:
$sql = "SELECT adpastrip_id, ( 3959 * acos( cos( radians($lat) ) *
cos( radians( lat1 ) ) * cos( radians( long1 ) - radians($lng) )
sin( radians($lat) ) * sin( radians( lat1 ) ) ) ) AS distance,
( 3959 * acos( cos( radians($lat2) ) *
cos( radians( lat2 ) ) * cos( radians( long2 ) - radians($lng2) )
sin( radians($lat2) ) * sin( radians( lat2 ) ) ) ) AS distance2
FROM addgoodstrip HAVING distance < 10 or distance2<10 ORDER BY
distance ASC LIMIT 0 , 20";
Ответ №3:
$sql = "SELECT adpastrip_id,
( 3959 * acos( cos( radians($lat) ) * cos( radians( lat1 ) ) * cos( radians( long1 ) - radians($lng) ) sin( radians($lat) ) * sin( radians( lat1 ) ) ) ) AS distance
FROM addgoodstrip
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 20
union
SELECT adpastrip_id,
( 3959 * acos( cos( radians($lat2) ) * cos( radians( lat2 ) ) * cos( radians( long2 ) - radians($lng2) ) sin( radians($lat2) ) * sin( radians( lat2 ) ) ) ) AS distance
FROM addgoodstrip
HAVING distance < 10
ORDER BY distance
LIMIT 0 , 20 ";
Union
не покажет вам повторяющиеся строки, поскольку это то же самое, что мы выполняем объединение для наборов (коллекция очень определенных отдельных объектов), если вам также нужны дубликаты, используйте union all
Комментарии:
1. Запрос объединения не вернет данные, соответствующие обоим критериям расстояния, он вернет те, которые соответствуют хотя бы одному, но не обязательно другому.
2. @Shadow union объединит результаты 2 запросов. Я надеюсь, что это то, что нужно OP
Ответ №4:
Я не думаю, что вам также нужно объединение, просто включите оба вычисления в один запрос и выполните фильтрацию в where
предложении для них обоих, чтобы получить результаты, соответствующие обоим критериям, и упорядочить по наименьшему из расстояний:
SELECT adpastrip_id,
( 3959 * acos( cos( radians($lat) ) * cos( radians( lat1 ) ) * cos( radians( long1 ) - radians($lng) ) sin( radians($lat) ) * sin( radians( lat1 ) ) ) )
AS distance1,
( 3959 * acos( cos( radians($lat2) ) * cos( radians( lat2 ) ) * cos( radians( long2 ) - radians($lng2) ) sin( radians($lat2) ) * sin( radians( lat2 ) ) ) )
AS distance2
FROM addgoodstrip
WHERE ( 3959 * acos( cos( radians($lat) ) * cos( radians( lat1 ) ) * cos( radians( long1 ) - radians($lng) ) sin( radians($lat) ) * sin( radians( lat1 ) ) ) ) <10 AND
( 3959 * acos( cos( radians($lat2) ) * cos( radians( lat2 ) ) * cos( radians( long2 ) - radians($lng2) ) sin( radians($lat2) ) * sin( radians( lat2 ) ) ) ) < 10
ORDER BY LEAST(distance1,distance2)
LIMIT 0 , 20";