2016-10-07 6 views
1

Мне нужна помощь в том, чтобы эти два запроса были помещены в один запрос. например, я хочу найти базу данных для путешествий, которые соответствуют радиусу $ 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 "; 

ответ

0
$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"; 
0
$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

+0

союз запрос не возвращает, которые соответствуют обоим критериям расстояния, он будет возвращать те, которые соответствуют по крайней мере один, но не обязательно другой. – Shadow

+0

@ Shadow union объединит результаты двух запросов. Надеюсь, это то, что нужно OP –

1

Вам не нужна JOIN, все, что вам нужно сделать, это произвести 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 
0

Я не думаю, что вам нужно присоединиться либо, просто включить оба вычисления в одном запросе и фильтра в предложении на них обоих 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"; 
Смежные вопросы