【问题标题】:How can I get non duplicate records in an SQL Union Query?如何在 SQL 联合查询中获得不重复的记录?
【发布时间】:2020-04-01 19:41:34
【问题描述】:

我的 SQL UNION 命令正在生成重复记录。是的,我知道 UNION ALL 应该包含重复项,而 UNION 不包含......但由于某种原因,我的仍在生成重复项。我不是 SQL 方面的专家,并且知道使用简单和基本的命令来获得我需要的东西......所以我确定我在某个地方搞砸了。

目标:从 SQL 数据库中检索新闻文章。我想抓取最多 4 篇文章,其中最相关的文章排在第一位。如果相关文章少于 4 篇(未过期),我想用最近创建的文章(未过期)填充剩余的文章。 (文章过期意味着某种交易已经结束,因此无需向公众展示该文章

当前代码(带示例):

SELECT *, 0 AS Priority 
FROM tblNews WHERE (ArticleKeywords LIKE '%alaska airlines%')
AND (CURRENT_DATE < ArticleExpireDate OR ArticleExpireDate = '0000-00-00') 
UNION 
SELECT *, 1 AS Priority 
FROM tblNews WHERE (CURRENT_DATE < ArticleExpireDate OR ArticleExpireDate = '0000-00-00') 
ORDER BY Priority, ArticleDate DESC LIMIT 4

此代码目前正在按预期生成四篇文章,但它显示:

  1. 阿拉斯加航空公司文章(相关文章)
  2. 第 2 条(最新文章)
  3. 第 3 条(最新文章)
  4. 阿拉斯加航空公司文章(最新文章)

发生这种情况是因为 a) ALASKA AIRLINES ARTICLE 是唯一相关的文章,b) ALASKA AIRLINES ARTICLE 也恰好是我最近的一篇文章。

我怎样才能让这个 UNION 正常工作,以便它抓取相关文章并用最新的文章填充剩余的文章,同时不包括可能是新的重复项?

[旁注(如果重要):如果有多个关键字,则初始 WHERE 命令可以包含多个 LIKE 命令。我在这个命令中保持简单,只显示一个关键字。我的 php 代码生成多个 LIKE 命令的功能工作正常......但我想知道这一点以防万一。]

【问题讨论】:

标签: mysql sql duplicates union


【解决方案1】:

结果集中名为Priority 的附加列可防止 MySQL 将记录识别为重复记录。

我认为你不需要UNION。条件排序应该可以完成工作:

SELECT *
FROM tblNews 
WHERE 
    ArticleExpireDate > CURRENT_DATE  
    OR ArticleExpireDate = '0000-00-00'
ORDER BY
    (ArticleKeywords LIKE '%alaska airlines%') DESC
    ArticleDate DESC
LIMIT 4

【讨论】:

    【解决方案2】:

    不要使用UNION ALL。使用ORDER BY

    SELECT n.*
    FROM tblNews n
    WHERE CURRENT_DATE < ArticleExpireDate OR
          ArticleExpireDate = '0000-00-00')
    ORDER BY (ArticleKeywords LIKE '%alaska airlines%') DESC,
          ArticleDate DESC
    LIMIT 4;
    

    【讨论】:

    • 谢谢!这就像一个魅力(尽管我确实删除了不再需要的优先级)。
    • @Kompalisky87 。 . .是的,你是对的。我删除了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多