繁体   English   中英

组合多个Mysql查询

[英]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_urldetails为空,可以使用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的正确用法,它也可能会影响性能。 你可以阅读更多关于havingwhere 在这里在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM