繁体   English   中英

在子查询中使用UNION ALL分组

[英]GROUP BY in SUBQUERY WITH UNION ALL

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

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

我正在使用UNION ALL将这些组合在一起,并在一个子查询中使用JOIN LEFT和JOIN RIGHT来创建FULL JOIN。

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。

我必须使用工会,因为我是从左向右加入,而在mySql中,不支持FULL JOIN。

所以我假设我需要GROUP BY historyId,因为在同时添加的行上(当通过查询和位置进行搜索时)此id始终是相同的。 问题是,我已经尝试和测试了,但是我似乎无法使它正常工作。 我想念什么吗?

最后,当我问一个问题时,因为我还没有进行测试,这是因为ORDER BY date位于OUTER或SUBQUERIES上,因为我想显示最新的结果作为第一个结果?

/* 更多信息 */

我需要输出:

SearchTerm(如果没有fullAddress)。 如果没有searchTerm,则为完整地址。 SearchTerm和fullAddress(如果同时存在)。

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

据了解,要被淘汰具有相同historyId重复,所以你应该能够使用UNION只要historyId包括在UNION使之与另一 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

暂无
暂无

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

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