结合多个Mysql查询

时间:2015-04-14 06:57:19

标签: php mysql

我有下表:

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中没有足够的技能来以智能方式组合它们。

对此的任何建议都会很棒。

1 个答案:

答案 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_urldetails都是空的,您可以使用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的正确使用,它也可能影响性能。您可以详细了解havingwhere herehere