【问题标题】:Eliminate duplicates from UNIONS消除 UNIONS 中的重复项
【发布时间】:2018-08-07 16:45:44
【问题描述】:

我正在尝试为社交媒体网站上的简单搜索栏创建 SQL 查询。到目前为止,我有这个:

SELECT DISTINCT Users.[user id], users.[first name] AS [Hit], users.[user profile hyperlink] AS [Hyperlink]
FROM users
WHERE users.[first name] LIKE '*web*'

UNION 
SELECT DISTINCT Users.[user id],  users.[last name], users.[user profile hyperlink]
FROM users
WHERE  users.[last name] LIKE '*web*'

UNION  
SELECT DISTINCT Users.[user id],  posts.[post content], posts.[post hyperlink]
FROM posts, users
WHERE posts.[post content] LIKE '*web*'
AND posts.[user id] = users.[user id]


UNION 
SELECT DISTINCT group.[group id], Group.[Group Name], group.[group page hyperlink]
FROM [Group]
WHERE Group.[Group Name] LIKE '*Web*'

UNION  
SELECT DISTINCT Users.[user id],  posts.[post content], posts.[post hyperlink]
FROM posts, users, posts_has_tags, tags
WHERE tags.[tag] LIKE '*web*'
AND posts_has_tags.[tag id] = tags.[tag id]

我还不想添加变量,所以我可以搜索“web”。但是查询返回了一些错误的结果(我认为这与最后一个联合查询有关)并为不同的用户 ID 重复其他结果。

谁能帮忙?

【问题讨论】:

  • 使用现代 JOIN 表示法可以使问题的根源更加清晰。 (即您的最后一个查询涉及 4 个表,但只“连接”其中两个。)
  • 是的,这应该使用连接,但如果你要联合它们,为什么不直接包装整个东西:Select Distinct * from (Your query)
  • 另外,LIKE '*web*'= '*web*' 相同; * 在 MySQL 中不是通配符,% 是。
  • 是的,请考虑使用现代 ANSI JOIN 代替旧的逗号语法。由于这些 JOIN,您可能会在最后一个查询中得到意想不到的结果。此外,您在 UNION 中的每个查询都应该具有相同的列。您能否提供一些架构、示例数据和您的预期结果?
  • 顺便说一句:与UNION ALL 不同,运算符UNION 删除重复项。无需额外的DISTINCT

标签: sql ms-access duplicates union


【解决方案1】:

第一个两个查询可以通过组合 where 子句组合在一起

SELECT DISTINCT Users.[user id], users.[first name] AS [Hit], users.[user profile hyperlink] AS [Hyperlink]
FROM users
WHERE users.[first name] LIKE '*web*' or users.[last name] LIKE '*web*'

同样,第 4 个查询返回 group.[group id] 作为第一列,其他查询返回 Users.[user id]。不知道如何区分两个不同的列,你会得到错误的数据

【讨论】:

    猜你喜欢
    • 2023-03-10
    • 2020-02-27
    • 2017-09-21
    • 2012-04-22
    • 2019-04-08
    • 2017-05-29
    • 2022-11-22
    • 2021-11-22
    • 1970-01-01
    相关资源
    最近更新 更多