[英]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.