我搜索和找到的所有东西都还没有工作,因为我是通过一个php脚本访问表的,而且与我看到的所有东西都不一样。不管怎样,
我从一个网站导入feed到一个mysql表中。我的桌子是这样做的。。。

$query2 = <<<EOQ
CREATE TABLE IF NOT EXISTS `Entries` (
`feed_id` int(11) NOT NULL,
`item_title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`item_link` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`item_date` varchar(40) COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
EOQ;
$result = $db_obj->query($query2);

我像这样输入数据。。。。
foreach($rss->channel->item as $Item){
$query5 = <<<EOQ
INSERT INTO Entries (feed_id, item_title, item_link, item_date)
VALUES ('$get_id','$Item->title','$Item->link','$Item->pubDate')
EOQ;
$result = $db_obj->query($query5);
}

现在,每次从站点导入新的feed时,我都要确保删除所有可能已经存在的重复项。我所做的每一件事,特别是那些与众不同的事,都不适合我。是否有人知道我可以使用什么类型的查询来创建临时表,复制任何不同的行(整行,如果标题相同但日期不同,我希望保留),删除旧表,然后将tamp表重命名为我想要的。。。。或者类似的?

最佳答案

首先避免使用重复的行。将任何唯一值设置为键。向数据库中添加新值时,请使用

REPLACE INTO Entries (feed_id, item_title, item_link, item_date)
VALUES ('$get_id','$Item->title','$Item->link','$Item->pubDate')
EOQ;

副本将被自动覆盖。Replace很方便,因为它的工作方式类似于在键没有冲突的情况下插入,但是当存在冲突时,它将更新记录并增加任何自动递增的键。
编辑
我在这件事上唠叨了好一阵子。这是我想到的。
在上设置多列键(feed_id、item_title、item_link、item_date)的问题是它将超过MySQL中对键长度的1000字节限制。因此,请改为这样更改模式:
CREATE TABLE IF NOT EXISTS `Entries` (
`hash` varchar(32),
`feed_id` int(11) NOT NULL,
`item_title` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`item_link` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
`item_date` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
 PRIMARY KEY (hash)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

现在,当您存储一个新值时,将这些值的哈希值放在一起:
$hash = md5($get_id . $Item->title . $Item->link . $Item->pubDate);

对于insert语句,请使用以下语句:
REPLACE INTO Entries (hash, feed_id, item_title, item_link, item_date)
VALUES ('$hash', '$get_id','$Item->title','$Item->link','$Item->pubDate')
EOQ;

散列将是整个记录的唯一表示,并且很容易进行比较以避免重复。现在,当尝试添加同一条记录不止一次时,它将只替换现有的条目,并且您的查询不会失败。另外,您可以继续使用insert,查询将返回一个错误,您可以根据需要处理该错误。

10-02 05:24
查看更多