私はこれについてしばらく探し回っていますが、私が必要としているものを正確に実行するものは何もありません.
経度と緯度の値を含むエントリを含むテーブルを検索しています。これにより、一連の結果が返されます。一部の日付値に基づいて返す必要がある 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)
何か案は?