【发布时间】: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