1

PHPを使用してRSSフィードを作成し、データベースからデータを取得するという最新のタスクを完了しました。

これらのアイテムの多く(すべてではないにしても)に重複があることに気付いたばかりで、それぞれを1つだけフェッチする方法を模索していました。

私のPHPループでは、2行ごとに印刷して、重複の各セットを1つだけ持つことができると思っていましたが、場合によっては、各記事が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必要なのは各セットから1つだけだからです。

サンプルデータ

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必要な実際の列を指定するとともに、クエリに固執しようとしましたが、これは機能しませんでした。

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を返します。代わりに使用できますGROUP 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 に答える