我有两个表,一个显示搜索查询历史记录,另一个显示位置。
第一个表用于搜索查询: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如果两者都有。
目前它输出前两个罚款,但后者将输出两次。
答案 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