1

我刚刚完成了使用 PHP 创建 RSS Feed 以从数据库中获取数据的最新任务。

我只是注意到这些项目中有很多(如果不是全部)有重复项,我试图弄清楚如何只获取每个项目中的一个。

我有一个想法,在我的 PHP 循环中,我只能打印出每隔一行,以使每组重复项中只有一个,但在某些情况下,每篇文章有 3 或 4 篇,所以它必须通过查询来实现。

询问:

SELECT * 
FROM uk_newsreach_article t1
    INNER JOIN uk_newsreach_article_photo t2
        ON t1.id = t2.newsArticleID
    INNER JOIN uk_newsreach_photo t3
        ON t2.newsPhotoID = t3.id
ORDER BY t1.publishDate DESC;

表结构:

uk_newsreach_article
--------------------
id | headline | extract | text | publishDate | ...

uk_newsreach_article_photo
--------------------------
id | newsArticleID | newsPhotoID

uk_newsreach_photo
------------------
id | htmlAlt | URL | height | width | ...

出于某种原因,有很多重复项,而每组数据中唯一真正独特的是uk_newsreach_article_photo.id因为即使在一组重复项uk_newsreach_article_photo.newsArticleIDuk_newsreach_article_photo.newsPhotoID是相同的,我所需要的只是每组中的一个,例如

样本数据

id | newsArticleID | newsPhotoID
--------------------------------
 2 |     800482746 |     7044521
10 |     800482746 |     7044521
19 |     800482746 |     7044521
29 |     800482746 |     7044521
39 |     800482746 |     7044521
53 |     800482746 |     7044521
67 |     800482746 |     7044521

我尝试DISTINCT在查询中添加 a 并指定我想要的实际列,但这不起作用。

4

2 回答 2

1

group by您选择的所有列HAVING COUNT(*) > 1都将消除所有重复项,如下所示:

SELECT * 
FROM uk_newsreach_article t1
    INNER JOIN uk_newsreach_article_photo t2
      ON t1.id = t2.newsArticleID
    INNER JOIN uk_newsreach_photo t3
      ON t2.newsPhotoID = t3.id
GROUP BY  t1.id, t1.headline, t1.extract, t1.text, t1.publishDate,
          t2.id, t2.newsArticleID, t2.newsPhotoID,
          t3.id, t3.htmlAlt, t3.URL, t3.height, t3.width
HAVING  COUNT(*) > 1
ORDER BY t1.publishDate DESC;
于 2011-11-29T14:26:22.593 回答
1

正如您所注意到的,DISTINCT运算符将返回每个 id。你可以用 aGROUP BY代替。

您必须决定id要保留哪些内容。在示例中,我使用了MIN但任何聚合函数都可以。

SQL 语句

SELECT MIN(t1.id), t2.newsArticleID, t2.newsPhotoID 
FROM uk_newsreach_article t1
    INNER JOIN uk_newsreach_article_photo t2
        ON t1.id = t2.newsArticleID
    INNER JOIN uk_newsreach_photo t3
        ON t2.newsPhotoID = t3.id
GROUP BY t2.newsArticleID, t2.newsPhotoID 
ORDER BY t1.publishDate DESC;

免责声明

现在,虽然这将是解决您当前问题的简单方法,但如果您决定不应该发生重复,您确实应该考虑重新设计您的表,以防止重复进入您的表。

于 2011-11-29T14:26:30.340 回答