sql >> データベース >  >> RDS >> Mysql

mysql結合テーブル自体

    select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
    from metatdatatable t1, metadatatable t2
    where t1.meta_key = "_wp_field1"
    and t2.post_id = t1.post_id
    and t2.meta_key = "_wp_field2"
    

    編集

    ...これをyrlat/ long calcの基礎として使用するには、一時テーブルを作成するか、以下の(簡略化されたDISTANCE calc)のようなクエリで結果をインラインで使用します

    select d1.post_id, d1.distance
    from
    (select r1.post_id, ABS($lat - r1.lat) + ABS($lon - r1.lon) as DISTANCE
    from (select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
        from metatdatatable t1, metadatatable t2
        where t1.meta_key = "_wp_field1"
        and t2.post_id = t1.post_id
        and t2.meta_key = "_wp_field2") as r1
    ) as d1
    where d1.distance <= 10
    order by d1.distance ASC
    

    NB。結果に対して「高価な」緯度/経度の計算を行う前、または一時テーブルに保存する前に、緯度/経度の結果に大まかなフィルターを適用することをお勧めします。アイデアは、半径10マイルの外側でr1の結果をすべて無視することです。

    一時テーブルを使用する場合は、ユーザーセッション固有になります。

    編集2

    地球の形 をご覧ください 詳細については、基本的に7分の緯度と経度は常に10マイルを超えるため、緯度と経度が度で記録されている場合、これは十分に近い0.117です。ターゲットから0.117を超えて異なるポイントは、半径10マイル以内に含めることはできません。これは、r1テーブルを次のようにフィルタリングできることを意味します:

    (select t1.post_id, t1.meta_value as lat, t2.meta_value as lon
            from metatdatatable t1, metadatatable t2
            where t1.meta_key = "_wp_field1"
            and t2.post_id = t1.post_id
            and t2.meta_key = "_wp_field2"
            and ABS(t2.meta_value - $lon) < 0.117
            and ABS(t1.meta_value - $lat) < 0.117
    ) as r1  
    

    NB。データがグリニッジ子午線、日付変更線、または赤道にまたがっている場合、これは厳密には正しくありません。すべての緯度/経度が北米向けであると仮定すると、問題にはなりません。



    1. 2つのテーブルからカウントを取得し、月ごとにグループ化

    2. 行がまだ存在しない場合にのみ行を挿入します

    3. テーブルヘッダーがphpのforループから繰り返されています

    4. カーソルでフィールド値を取得する