-1

私はこれについてしばらく探し回っていますが、私が必要としているものを正確に実行するものは何もありません.

経度と緯度の値を含むエントリを含むテーブルを検索しています。これにより、一連の結果が返されます。一部の日付値に基づいて返す必要がある long/lat 値を持たないエントリもあります。

通常、この 2 つは重複した結果を生成しないことはわかっていますが、この種のクエリを実行する方法を知りたいと思っています。

Q1:

"SELECT id, from_date, to_date, event_title, event_longitude, event_latitude, 
(SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) + 
POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) 
* 1609.344) AS distance, (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) 
+ POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) 
* 1609.344) AS true_distance FROM table1 WHERE id!=0 AND no_place='0' 
AND from_date >= '45645646' AND to_date <= '76647446' HAVING distance <= '5000' 
ORDER BY distance ASC LIMIT 50"

これにより、緯度経度の範囲に一致するエントリが返され、no_place=0 とマークされたエントリは無視されます。これは、長い/緯度の計算を行うために Haversine を使用します。

2 番目のクエリは、long/lat を持たないが、日付範囲に一致するエントリを取得する必要があります。

Q2:

"SELECT id, from_date, to_date, event_title, event_longitude, event_latitude FROM
table1 WHERE no_place='1' AND from_date >= '45645646' AND to_date <= '76647446' 
LIMIT 50"

ここで 2 つの個別のクエリを実行し、「WHERE ids !in(ids,from,q1)」を追加できます。

2 番目のクエリに対して、次に PHP を使用して 2 つの結果をマージします。MySQL には、これを行うための狡猾な方法が必要です。質問はこれです:

Q1 で既に見つかった ID を無視して、1 回のクエリでこれを行うにはどうすればよいでしょうか。このシナリオでは重複する行がないことを保証する no_place 列があることはわかっていますが、この列がないと仮定すると、どのように追加しますか

"WHERE ids !in(ids,from,q1)" 

句?また、この合計結果を最初に no_place=1 エントリで並べ替え、次に no_place=0 エントリを距離値で並べ替える必要があると思います。

ふぅ!


「Hope I Helped」からの素晴らしい回答の後の更新

これは機能しているように見えますが、結果の距離値が失われます。

(SELECT id, from_date, to_date, event_title, event_longitude, event_latitude, 
(SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) + POW( 69.1 * 
( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) * 1609.344) 
AS distance, (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) + POW( 69.1 
* ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) * 1609.344) 
AS true_distance FROM table1 WHERE id!=0 AND no_place='0' 
HAVING distance <= '5000' ORDER BY distance ASC LIMIT 50) UNION(SELECT id, from_date, 
to_date, event_title, event_longitude, event_latitude, 0, 0 FROM table1 WHERE 
no_place='1' LIMIT 50)

これは機能しますが、現在、クエリに半径制限はありません...

(SELECT id, from_date, to_date, event_title, event_longitude, event_latitude, 
(SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) + 
POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) 
* 1609.344) AS distance, (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) 
+ POW( 69.1 * ( -0.195226 - event_longitude ) * COS( event_latitude / 57.3 ) , 2 ) ) 
* 1609.344) AS true_distance FROM table1 WHERE id!=0 AND no_place='0' ORDER BY
distance ASC LIMIT 50) UNION(SELECT id, from_date, to_date, event_title, 
event_longitude, event_latitude, 0, 0 FROM table1 WHERE no_place='1' LIMIT 50)

何か案は?

4

1 に答える 1

1

試す:

(SELECT id, from_date, to_date, event_title, event_longitude, event_latitude,
    (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) +
    POW( 69.1 * ( -0.195226 - event_longitude ) *
    COS( event_latitude / 57.3 ) , 2 ) ) * 1609.344) AS distance,
    (SQRT( POW( 69.1 * ( event_latitude - 51.4999501637 ) , 2 ) +
    POW( 69.1 * ( -0.195226 - event_longitude ) *
    COS( event_latitude / 57.3 ) , 2 ) ) * 1609.344) AS true_distance
    FROM table1
    WHERE id!=0 AND no_place='0' AND from_date >= '45645646' AND
    to_date <= '76647446'
    HAVING distance <= '5000'
    ORDER BY distance ASC 
    LIMIT 50)
        UNION
    (SELECT id, from_date, to_date, event_title, event_longitude, event_latitude,
    0, 0
    FROM table1
    WHERE no_place='1' AND from_date >= '45645646' AND to_date <= '76647446'
    LIMIT 50)

を適用するUNIONと、重複することなく両方のセットから結果を取得できます。

于 2012-09-25T15:50:42.787 に答える