SQL:要合并的两个不同查询

时间:2012-12-09 15:47:50

标签: mysql

我有两个不同的查询。

此查询根据其回复计数器从“posts”表中提取记录。此查询仅返回包含回复的帖子:

SELECT posts.title, posts.num, posts.status, COUNT( posts_replies.post_num)  AS count
FROM posts_replies
INNER JOIN posts ON ( posts_replies.post_num = posts.num )
WHERE posts.status = 1
AND posts.category='uncategorized'
GROUP BY posts.num

这是一个新的查询,我希望与上面的查询合并,以按照gps对记录进行拉取和排序。

SELECT num, title, ( 3959 * acos( cos( radians( 37 ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( -122 ) ) + sin( radians( 37 ) ) * sin( radians( lat ) ) ) ) AS distance
FROM posts
HAVING distance <75
ORDER BY distance

此查询使用lat和long列返回用户半径75英里范围内的记录。

我不是SQL专家,也不知道如何合并两个查询以收集具有以下条件的结果:

  1. 仅返回包含回复的帖子
  2. 按距离排序
  3. 按回复数量排序
  4. 任何帮助都将受到高度赞赏。

    谢谢!

1 个答案:

答案 0 :(得分:3)

第二个查询中的having子句看起来不正确。在没有group by的情况下,不允许使用SQL的大多数方言。我忘记了MySQL是否隐式将整个查询视为聚合(返回一行)或having转换为where。在任何一种情况下,您都应该明确,并且在没有聚合时使用where

您可以通过添加where子句来组合它们。我会用子查询来做,以使变量定义更清晰:

      SELECT p.title, p.num, p.status, p.distance,
             COUNT( p_replies.post_num)  AS count
      FROM posts_replies pr  INNER JOIN
           (select p.*,
                   ( 3959 * acos( cos( radians( 37 ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( -122 ) ) + sin( radians( 37 ) ) * sin( radians( lat ) ) ) ) AS distance
            from posts p
           ) p
           ON pr.post_num = p.num
      WHERE p.status = 1 AND
            p.category='uncategorized' and
            distance < 75
      GROUP BY p.num
      order by distance