我有下表:
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中没有足够的技能来以智能方式组合它们。
对此的任何建议都会很棒。
答案 0 :(得分:1)
虽然未提供架构,但似乎只有一个表。也许这就是你想要做的事情:
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<>''
到哪里条件。or
来取消某些条件他们的连词。[编辑]
MySQL(也称为标准SQL)不允许在WHERE
子句中引用列别名(请参阅manual)。因此,您要么重复完整表达式来计算其中的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
here或here。