[英]Combining Multiple Mysql Queries
我有下表:
id user_id recorded latitude longitude speed note_type details image_url
1 10 3/29/2013 33.77701316 -84.39004377 -1 11 Test 2ecc2e36c3e1a512d349f9b407fb281e-2013-03-29-16-15-..
我正在尝试找到一种方法,将以下查询合并为一个完整的查询,该查询将为我提供与每个单独查询匹配的所有记录(这些记录分别可以正常工作,只是无法弄清楚如何组合它们):
SELECT id, ( 3959 * acos( cos( radians(User_Input_Longitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(User_Input_Latitude) ) + sin( radians(User_Input_Longitude) ) * sin( radians( latitude ) ) ) ) AS distance
FROM note HAVING distance < User_Input_Distance
ORDER BY distance LIMIT 0 , 1000
SELECT details
FROM note
WHERE CHAR_LENGTH(details) > User_Input_CharacterLength
SELECT DISTINCT details
FROM note;
SELECT DISTINCT image_url
FROM note;
因此,基本上我需要一个查询,该查询将基于长点/纬度点的距离与用户定义的长点/纬度点和用户定义的距离进行比较,检查详细信息字段的字符长度,然后最后仅对细节和image_urls进行记录(image_urls和详细信息的所有内容都留为空白,因此我一直在使用distinct仅查找那些实际具有数据的对象,不确定是否这样做是正确的方法)。
就像我之前说过的那样,每个查询现在都可以单独工作,但是不幸的是,我在mySql中没有足够的Skillz来以智能方式组合它们。
任何建议,这将是巨大的。
尽管未提供架构,但似乎只有一个表。 也许这就是您想要做的:
SELECT id, ( 3959 * acos( cos( radians(User_Input_Longitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(User_Input_Latitude) ) + sin( radians(User_Input_Longitude) ) * sin( radians( latitude ) ) ) ) AS distance, details, image_url
FROM note
WHERE ( 3959 * acos( cos( radians(User_Input_Longitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(User_Input_Latitude) ) + sin( radians(User_Input_Longitude) ) * sin( radians( latitude ) ) ) ) < User_Input_Distance
AND CHAR_LENGTH(details) > User_Input_CharacterLength
AND (details IS NOT NULL AND details<>'')
AND (image_url IS NOT NULL AND image_url<>'')
ORDER BY distance LIMIT 0, 1000
一些注意事项:
having
条款不group by
条款是不是真的使用条件查询,通常情况下,你应该使用一个很好的方法where
替代(见下文)。 image_url
和details
为空,可以使用is not null
来检查它们是否为NULL。 如果您也想过滤空字符串, details<>'' and image_url<>''
在where条件中添加例如details<>'' and image_url<>''
。 or
分离某些条件而不是它们的结合。 [编辑]
MySQL(也作为标准SQL)不允许在WHERE
子句中引用列别名(请参阅手册 )。 因此,您可以重复完整的表达式以计算其中的distance
,也可以使用HAVING
子句(此处应产生相同的结果,但方式略有不同)。
SELECT id, ( 3959 * acos( cos( radians(User_Input_Longitude) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(User_Input_Latitude) ) + sin( radians(User_Input_Longitude) ) * sin( radians( latitude ) ) ) ) AS distance, details, image_url
FROM note
HAVING distance < User_Input_Distance
AND CHAR_LENGTH(details) > User_Input_CharacterLength
AND (details IS NOT NULL AND details<>'')
AND (image_url IS NOT NULL AND image_url<>'')
ORDER BY distance LIMIT 0, 1000
它之所以有效,是因为在HAVING
您可以引用别名,但是在没有GROUP BY
情况下使用别名实际上并不是SQL的正确用法,它也可能会影响性能。 你可以阅读更多关于having
与where
在这里或在这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.