如何消除“重复”的URL MySQL行,可能是也可能不是以www开头?

时间:2010-07-30 18:59:10

标签: php sql mysql drupal duplicates

我一直在使用名为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查询中处理它?<​​/ p>

2 个答案:

答案 0 :(得分:2)

也许:

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;

但是,我现在无法自己测试。

答案 1 :(得分:1)

假设$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()