2010-07-30 8 views
1

J'ai utilisé un module Drupal appelé FeedAPI De-Dupe pour supprimer les enregistrements en double de la base de données (MySQL) de mon site. Le module fait un excellent travail, mais il me reste encore quelques «doublons» lorsque les URL contiennent parfois «www» et parfois non. Le code handling the duplicate detection est:Comment éliminer les URL MySQL "dupliquées" qui peuvent commencer ou non par www?

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; 

Est-il possible de modifier le SQL pour gérer aussi le www/sans www cas? Sinon, existe-t-il un moyen de le gérer dans une requête SQL séparée à la place?

+0

Que contient '$ url'? L'URL complète ou juste le domaine? – kiamlaluno

+0

kiamlanu, $ url contient l'URL complet, tel que: http://stackoverflow.com/questions/3374539/comment-diminuer-dupliquer-url-mysql-rows-qui-may-a-may-not -start-with-www –

+0

Doh! Le code que j'ai posté n'est que la moitié de la bataille. Il évite les doublons lors de l'ajout de nouvelles entrées. Une autre fonction supprime les doublons déjà ajoutés: cas 0: // base url $ sql = "SELECT GROUP_CONCAT (i.nid SEPARATOR ',') comme nids,' titre', 'url', compte (*) en num FROM {} nœud n INNER JOIN {feedapi_node_item} i = ON i.nid n.nid OU type = '% de' GROUP BY '' url' PRESENTANT url' IS NOT NULL et l'URL! = '' ET num> 1 ORDER BY num desc LIMIT% d "; pause; Je déteste même demander, puisque vous avez tous deux été super utile, mais toutes les pensées sur cette section seraient également grandement appréciées! –

Répondre

2

Peut-être:

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('@//[email protected]', '//' $url))); 
break; 

Cependant, je ne peux pas tester moi-même en ce moment.

+0

Je ne pense pas que cela fonctionnera car le champ url contient l'URL complète (ie, "http://example.com" et non "example.com"). –

+0

Ok, j'ai modifié le code en fonction de cela. Encore non testé, et probablement besoin de quelques modifications, mais vous avez l'idée. – Johan

1

Supposant que $url contient l'URL complète (y compris la http:// partie), le code suivant doit faire ce que vous demandez:

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) 
); 

Si l'URL contenue dans la base de données contient des valeurs telles que `http://example.com/directory, vous pouvez utiliser le code suivant:

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) 
); 

Dans Drupal, si vous voulez limiter le nombre de lignes obtenues à partir d'une requête, vous devez utiliser db_query_range().