带有UNION ALL的SUBQUERY中的GROUP BY

时间:2014-06-18 18:59:55

标签: mysql subquery union-all

我有两个表,一个显示搜索查询历史记录,另一个显示位置。

第一个表用于搜索查询:searchTerm |日期| userId | historyId 第二个是位置:userId |日期| historyId | lat | LNG

我正在使用UNION ALL将这些组合在一起,在子查询中使用JOIN LEFT&加入右边创建一个完整的联接。

SELECT st, fa FROM
                 (SELECT webHistory.searchTerm AS st, locationHistory.fullAddress AS fa
                  FROM webHistory LEFT OUTER JOIN locationHistory
                  ON webHistory.historyId=locationHistory.historyId
                  UNION ALL
                  SELECT webHistory.searchTerm as st, locationHistory.fullAddress AS fa
                  FROM webHistory RIGHT OUTER JOIN locationHistory
                  ON webHistory.historyId=locationHistory.historyId) t

每件事情都很美妙我在webHistory表中只获得了条目的结果,而对于locationHistory表也是如此。我遇到的问题是当我获得已添加到两者的行时。他们展示了两次!

我不能仅仅使用联盟,因为它将比我想要的更多地加入。如果添加了两个相同的搜索,则不会显示两个,而是将它们合并为一个。所以我需要使用UNION ALL。

我必须使用union,因为我从LEFT和RIGHT加入,并且在mySql中不支持FULL JOIN。

所以我假设我需要GROUP BY historyId,因为这个id在同时添加的行上总是相同(当通过查询和位置进行搜索时)。问题是,我已经尝试过并且经过了测试,但我似乎无法让它发挥作用。我错过了什么吗?

最后,虽然我在问一个问题并且因为我还没有达到测试的目的,但是ORDER BY date会出现在我要显示的OUTER或SUBQUERIES上最新的作为第一个结果?

/ *更多信息* /

我需要输出:

SearchTerm,如果没有fullAddress。 如果没有searchTerm,则为完整地址。 SearchTerm& fullAddress如果两者都有。

目前它输出前两个罚款,但后者将输出两次。

1 个答案:

答案 0 :(得分:2)

据了解,您希望删除具有相同historyId的重复项,因此只要history {1}包含在UNION中,您就应该可以使用UNION,以便与< em>另一个 historyId不会被淘汰;

SELECT st, fa FROM
 (SELECT webHistory.searchTerm AS st, 
         locationHistory.fullAddress AS fa, 
         webHistory.historyId
  FROM webHistory LEFT OUTER JOIN locationHistory
  ON webHistory.historyId=locationHistory.historyId
  UNION
  SELECT webHistory.searchTerm as st, 
         locationHistory.fullAddress AS fa,
         locationHistory.historyId
  FROM webHistory RIGHT OUTER JOIN locationHistory
  ON webHistory.historyId=locationHistory.historyId) t