как присоединиться к этим запросам

#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";