我的桌子上有多个索引。其中两个索引与成员的纬度和经度有关,用于计算成员之间的距离。
问题是,在计算成员之间的距离之后,我需要通过其他条件过滤结果集,即
我首先想要选择所有居住在5英里范围内的成员。
根据该结果,我想按照符合其他条件的成员过滤结果。
我不确定这是否可行,并且非常欢迎就进行此查询的最佳方式提供建议。
我得到了用于计算here:
成员之间距离的公式下面是我的查询。
SELECT *
FROM (
SELECT
u.qualityOfPictures,u.id,
st.statement,
ph.thumbsize
,
3956 * ACOS(COS(RADIANS('51.5247725')) * COS(RADIANS(`latitude`)) * COS(RADIANS('-0.13342680000005203') - RADIANS(`longitude`)) + SIN(RADIANS('51.5247725')) * SIN(RADIANS(`latitude`))) AS `distance`
FROM user u
LEFT OUTER JOIN
members_statement st
ON
u.id = st.id
LEFT OUTER JOIN
list_photos_uploaded_by_members ph
ON
u.id = ph.id
WHERE
`latitude`
BETWEEN '51.5247725' - ('5' / 69)
AND '51.5247725' + ('5' / 69)
AND `longitude`
BETWEEN '-0.13342680000005203' - ('5' / (69 * COS(RADIANS('51.5247725'))))
AND '-0.13342680000005203' + ('5' / (69* COS(RADIANS('51.5247725'))))
AND
u.live = 1
AND
u.membershipType =1
AND jobId IN (2,4,1)
) r
WHERE `distance` < '5'
ORDER BY `distance` ASC
这是我时的解释声明 这是SQLfiddle
中的查询当我取出其他条件并留下查询距离时,这是解释性说明。
中的查询这些是表格:
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`membershipType` smallint(6) DEFAULT NULL,
`qualityOfPictures` smallint(6) DEFAULT NULL,
`city` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`latitude` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
`longitude` varchar(150) COLLATE utf8_unicode_ci DEFAULT NULL,
`live` tinyint(1) NOT NULL,
`jobId` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `quick_search` (`live`,`membershipType`,`jobId`,`city`(5)),
KEY `latitude` (`latitude`),
KEY `longitude` (`longitude`)
);
成员声明表
CREATE TABLE IF NOT EXISTS `members_statement` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`statement` varchar(2000) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `list_photos_uploaded_by_members` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`thumbsize` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ;