テーブル格納して表示した記事を重複で表示させない
以下のコードに①select countを用いる方法と②select existsを用いる方法を使いコンテンツの重複を避けるようにしたいと思っています。
調べたところ、以下の場合はselect countを避けるべきだとありました。RSSをテーブルに1ページ36×10ページの360コンテンツ格納するつもりです。この場合かなり重くなることが想定されるのですが、select existsを使いすでに表示された記事を除外することはできるのでしょうか?idなどで除外している例はあるのですが、すでに表示した記事にはないため方法がわかりません。
・カウント対象件数が多い
・インデックスが効かない
・繰り返し実行することが多い
<?php
try {
$dsn = 'mysql:dbname=hlxclitx_wp1;host=localhost';
$user = 'hlxclitx_wp1';
$password = 'E.HrypHWxNmltXgC5eS26';
$dbh = new PDO($dsn,$user,$password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);//エラーが発生した時に、例外を投げる
echo "データベースへの接続が出来ました";
}catch (PDOException $e) {
echo $e->getMessage();// err時はメッセージを表示
exit;
}
//RSSをまとめる
$url1 = [
'http://blog.livedoor.jp/dqnplus/index.rdf',
'http://alfalfalfa.com/index.rdf',
'http://himasoku.com/index.rdf',];
// insertの準備
$stmt = $dbh->prepare('insert into teblename (title, link, date) values (?, ?, ?)');
// URLのループ開始 テーブルに格納
foreach ($url1 as $url) {
// simplexml_load_file()でRSSをパース解析してオブジェクトを取得します。
if (($rss = @simplexml_load_file($url)) === false) continue;
$site_title = $rss->channel->title;// RSSタイトル取得 値の代入 自作関数
// サイトごとに表示するなら、サイトタイトル表示はこの位置
printf('<h2>%s</h2>', $site_title);
$count = 0;
// 個別記事のループ開始 RSSの取得が始まる
foreach ($rss->item as $item) {
if (++$count > 8) break;
$title = $item->title;//タイトル取得
$link = $item->link;//リンクを取得
$dc = $item->children('http://purl.org/dc/elements/1.1/');//RSSの情報を取得
$thumb = $item->thumb->url;//画像を取得
//重複データを避けるため ・カウント対象件数が多い・インデックスが効かない・繰り返し実行することが多い
$sql = "select exists ('select * from rss_feed')";
// 取得した記事データの表示
if ($count === 1) print('<ul>');
$date = date('Y-m-d H:i:s', strtotime($dc->date));//RSS日付け取得
printf('<li class="sitelink"><a href="%s">%s</a></li>', $link, $title);
printf('<li class="sitelink"><a href="%s">site</a></li>', $link);
printf('<li class="sitedate">%s</li>', $date);
printf('<li class="sitethumb"><a href="%s"><img src="%s"></a></li>', $link, $thumbnail);
print '</ul>';// $title, $link, $date,$thumb を表示
}
if ($count) print('</ul>');
}
?>