如何消除可能以或不以 www 开头的“重复”URL MySQL 行?
Posted
技术标签:
【中文标题】如何消除可能以或不以 www 开头的“重复”URL MySQL 行?【英文标题】:How to eliminate "duplicate" URL MySQL rows which may or may not start with www? 【发布时间】:2010-07-30 18:59:09 【问题描述】:我一直在使用名为 FeedAPI De-Dupe 的 Drupal 模块从我的站点 (mysql) 数据库中删除重复记录。该模块做得很好,但是当 URL 有时包含“www”而有时不包含时,我仍然会留下一些“重复项”。 code handling the duplicate detection 是:
case 0: //url-based
$sql = "SELECT n.nid
FROM node n
INNER JOIN feedapi_node_item i ON i.nid=n.nid
WHERE type='%s' AND url = '%s'
LIMIT 1";
$dnid = db_result(db_query($sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
$url));
break;
有没有办法修改 SQL 来处理 www/no-www 的情况?如果没有,有没有办法在单独的 SQL 查询中处理它?
【问题讨论】:
$url
包含什么?完整的 URL,还是只是域?
kiamlanu,$url包含完整的URL,如:***.com/questions/3374539/…
噢!我发布的代码只是成功的一半。添加新条目时避免重复。另一个函数删除已添加的重复项: case 0: //url-based $sql = "SELECT GROUP_CONCAT(i.nid SEPARATOR ',') as nids, title
, url
, count(*) as num FROM node n INNER JOIN feedapi_node_item i ON i.nid=n.nid WHERE type='%s' GROUP BY url
HAVING url
IS NOT NULL AND url!='' AND num>1 ORDER BY num desc LIMIT %d";休息;我什至不想问,因为你们俩都非常乐于助人,但是对于本节的任何想法也将不胜感激!
哇,这些 cmets 中的代码并没有完全通过。让我再试一次... 哇!我刚刚意识到我发布的代码只是成功的一半。它在添加新条目时避免重复。 feedapi_dedupe_clean_duplicates 函数删除已添加的重复项(请参阅文件底部):bit.ly/beRwVQ 我什至不想问,因为你们俩都非常有帮助,但是任何关于向该函数添加 www/no-www 检查的想法也会不胜感激!即使是指向正确方向的指针也会有所帮助。再次感谢!
【参考方案1】:
也许:
case 0: //url-based
$sql = "SELECT n.nid
FROM node n
INNER JOIN feedapi_node_item i ON i.nid=n.nid
WHERE type='%s' AND (url = '%s' OR url = '%s')
LIMIT 1";
$dnid = db_result(
db_query(
$sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
$url,
preg_replace('@//www.@', '//' $url)));
break;
但是,我现在无法自己测试。
【讨论】:
我认为这行不通,因为 url 字段包含完整的 url(即“example.com”而不是“example.com”)。 好的,我按照那个修改了代码。仍然未经测试,可能需要一些修改,但你明白了。【参考方案2】:假设 $url
包含完整的 URL(包括 http://
部分),以下代码应该可以满足您的要求:
preg_match('@^(?:http://)?([^/]+)@i', $url, $matches);
$sql = "SELECT n.nid
FROM node n
INNER JOIN feedapi_node_item i ON i.nid=n.nid
WHERE type='%s' AND (url = '%s' OR url = '%s')";
$dnid = db_result(db_query_range($sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
'http://www.' . $matches[1], 'http://' . $matches[1], 0, 1)
);
如果数据库中包含的 URL 包含类似 `http://example.com/directory 的值,那么您可以使用以下代码:
preg_match('@^(?:http://)?([^/]+)@i', $url, $matches);
$sql = "SELECT n.nid
FROM node n
INNER JOIN feedapi_node_item i ON i.nid=n.nid
WHERE type='%s' AND (url LIKE '%s' OR url LIKE '%s')";
$dnid = db_result(db_query_range($sql,
variable_get('feedapi_dedupe_content_type', feedapi_dedupe_content_type()),
'http://www.' . $matches[1] . '/%', 'http://' . $matches[1] . '/%', 0, 1)
);
在Drupal中,如果要限制从查询中获取的行数,需要使用db_query_range()
。
【讨论】:
以上是关于如何消除可能以或不以 www 开头的“重复”URL MySQL 行?的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB 聚合:FieldPath 可能不以 $ 开头