【问题标题】:SQL meta joins plus Haversine formularSQL 元联接加上 Haversine 公式
【发布时间】:2014-01-14 22:22:01
【问题描述】:

我有一个查询,它将一些元数据连接到用户。

            SELECT
                users.*,
                gender.meta_value AS `gender`,
                sexual_orientation.meta_value AS `sexual_orientation`,
                relationship_status.meta_value AS `relationship_status`,
                interest_1.meta_value AS `interest_1`,
                interest_2.meta_value AS `interest_2`,
                interest_3.meta_value AS `interest_3`,
                interest_4.meta_value AS `interest_4`,
                interest_5.meta_value AS `interest_5`,
                interest_6.meta_value AS `interest_6`,
                address.address_line_1,
                address.address_line_2,
                address.town,
                address.county,
                address.postcode,
                address.country,
                address.longitude,
                address.latitude
            FROM
                `users`
            JOIN
                `storage_varchars` AS `gender`
            ON
                gender.user_id = users.id AND gender.meta_name = 'gender'
            JOIN
                `storage_varchars` AS `sexual_orientation`
            ON
                sexual_orientation.user_id = users.id AND sexual_orientation.meta_name = 'sexual_orientation'
            JOIN
                `storage_varchars` AS `relationship_status`
            ON
                relationship_status.user_id = users.id AND relationship_status.meta_name = 'relationship_status'
            JOIN
                `storage_varchars` AS `interest_1`
            ON
                interest_1.user_id = users.id AND interest_1.meta_name = 'interest_1'
            JOIN
                `storage_varchars` AS `interest_2`
            ON
                interest_2.user_id = users.id AND interest_2.meta_name = 'interest_2'
            JOIN
                `storage_varchars` AS `interest_3`
            ON
                interest_3.user_id = users.id AND interest_3.meta_name = 'interest_3'
            JOIN
                `storage_varchars` AS `interest_4`
            ON
                interest_4.user_id = users.id AND interest_4.meta_name = 'interest_4'
            JOIN
                `storage_varchars` AS `interest_5`
            ON
                interest_5.user_id = users.id AND interest_5.meta_name = 'interest_5'
            JOIN
                `storage_varchars` AS `interest_6`
            ON
                interest_6.user_id = users.id AND interest_6.meta_name = 'interest_6'
            JOIN
                `payments` AS `address`
            ON
                address.user_id = users.id 

我现在想用它来使用 Haversine 公式通过最近距离进行搜索。

SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

如何合并为两个?

问候

【问题讨论】:

    标签: mysql haversine


    【解决方案1】:

    好的,我想出了一个方法,但谁能告诉我这是否正确?

    $usersLatitude = '53.1765254';
    $usersLongitude = '-1.1954137';
    $distance = 20;
    
    $query = "
        SELECT main.* FROM
        (
            SELECT
                users.*,
                gender.meta_value AS `gender`,
                sexual_orientation.meta_value AS `sexual_orientation`,
                relationship_status.meta_value AS `relationship_status`,
                interest_1.meta_value AS `interest_1`,
                interest_2.meta_value AS `interest_2`,
                interest_3.meta_value AS `interest_3`,
                interest_4.meta_value AS `interest_4`,
                interest_5.meta_value AS `interest_5`,
                interest_6.meta_value AS `interest_6`,
                address.address_line_1,
                address.address_line_2,
                address.town,
                address.county,
                address.postcode,
                address.country,
                address.longitude,
                address.latitude,
                ( 3959 * acos( cos( radians( {$usersLatitude} ) ) * cos( radians( address.latitude ) ) * cos( radians( address.longitude ) - radians( {$usersLongitude} ) ) + sin( radians( {$usersLatitude} ) ) * sin( radians( address.latitude ) ) ) ) AS distance
            FROM
                `users`
            JOIN
                `storage_varchars` AS `gender`
            ON
                gender.user_id = users.id AND gender.meta_name = 'gender'
            JOIN
                `storage_varchars` AS `sexual_orientation`
            ON
                sexual_orientation.user_id = users.id AND sexual_orientation.meta_name = 'sexual_orientation'
            JOIN
                `storage_varchars` AS `relationship_status`
            ON
                relationship_status.user_id = users.id AND relationship_status.meta_name = 'relationship_status'
            JOIN
                `storage_varchars` AS `interest_1`
            ON
                interest_1.user_id = users.id AND interest_1.meta_name = 'interest_1'
            JOIN
                `storage_varchars` AS `interest_2`
            ON
                interest_2.user_id = users.id AND interest_2.meta_name = 'interest_2'
            JOIN
                `storage_varchars` AS `interest_3`
            ON
                interest_3.user_id = users.id AND interest_3.meta_name = 'interest_3'
            JOIN
                `storage_varchars` AS `interest_4`
            ON
                interest_4.user_id = users.id AND interest_4.meta_name = 'interest_4'
            JOIN
                `storage_varchars` AS `interest_5`
            ON
                interest_5.user_id = users.id AND interest_5.meta_name = 'interest_5'
            JOIN
                `storage_varchars` AS `interest_6`
            ON
                interest_6.user_id = users.id AND interest_6.meta_name = 'interest_6'
            JOIN
                `payments` AS `address`
            ON
                address.user_id = users.id
        ) AS `main`
        WHERE
            `main`.distance < {$distance}
        ORDER BY
            `main`.distance
    ";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-10
      • 1970-01-01
      • 2015-02-26
      • 2012-10-26
      • 2017-01-13
      • 2014-06-21
      • 1970-01-01
      • 2017-03-05
      相关资源
      最近更新 更多