如何消除可能以或不以 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 行?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

为什么有些网站的域名不以“www”开头?

为什么有些网站的域名不以“www”开头?

MongoDB 聚合:FieldPath 可能不以 $ 开头

MongoError 异常:FieldPath 字段名称可能不以“$”开头

如何通过正则表达式检测内容中的任何 URL [重复]