2016-09-19 8 views
0

私は、概念証明の冒険に取り組んでおり、何をしようとしているのはHTMLをループし、すべてのリンクを見つけてC#を使用してリンクを保存しています。リンクの部分が完全に動作していることを確認しますが、リンクをテーブルに保存すると、それらは徐々に複製されます。 1:1 1:2 1:2 1:3 1:3 1:3 1:4 1:4 1:4 1:4表にC#ループ重複レコードが挿入されました

レコード以下の例 等...

ページテーブル:

| page_id | page_url  | date_added | 
    ------------------------------------------ 
    | 1  | "http://bla.com |   | 

リンクテーブル:

リンクを取得する
| link_id | link_page_id | date_added | 
    --------------------------------------- 

コード:リンクを保存する

private static void getLinks(string contents, string url) 
    { 
     HtmlDocument html = new HtmlDocument(); 
     html.LoadHtml(contents); 

     HtmlNodeCollection links = html.DocumentNode.SelectNodes("//a[@href]"); 

     foreach(HtmlNode link in links) 
     { 
      foreach(HtmlAttribute attr in link.Attributes) 
      { 
       if(attr.Name == "href") 
       { 
        saveLinks(url, attr.Value); 
       } 
      } 
     } 

    } 

はコード:私のコンソール出力IMに

private static void saveLinks(string url, string link) 
    { 
     try 
     { 
      Console.WriteLine(url + " - " + link); 
      MySqlCommand cmd = new MySqlCommand(); 
      cmd.Connection = conn; 
      cmd.CommandText = @"INSERT INTO 
            sites.links(
             links_page_id, 
             link 
            ) 
           SELECT 
            p.page_id, 
            @link 
           FROM 
            sites.links l 
           RIGHT JOIN 
            sites.pages p 
           ON p.page_url = @url"; 
      cmd.Prepare(); 

      cmd.Parameters.AddWithValue("@url", url); 
      cmd.Parameters.AddWithValue("@link", link); 
      cmd.ExecuteNonQuery(); 
     } 

     catch (MySqlException e) 
     { 
      Console.WriteLine("Failure: " + e.Message); 
     } 
    } 

重複なしとのリンク数の期待値を取得し、私がテストしましたmysqlとすべてのクエリは良いようだ。おそらく何か愚かな私は見落としているが、私は間違って何を見つけることができないようだ。だから、どんな助けも素晴らしいだろう。ので、ここで

SELECT p.page_id, @link 
FROM sites.links l 
RIGHT JOIN sites.pages p ON p.page_url = @url"; 

は意味がありませんすべてのものです:

+0

に参加する必要はありませんが、私は知りませんあなたの実際のテーブル構造..またはあなたは選択することができますDistinct – MethodMan

+0

私は幸運と内部結合を試みました。私はテーブル構造で質問を更新しました – jgetner

答えて

1

は、あなたがそのurlでpage_idを取得する必要がある場合、あなたはそれがあなたの `RIGHT JOIN`だ、私は内部結合だけの単純なものを期待するかもしれないsites.links

  cmd.CommandText = @"INSERT INTO 
           sites.links(
            links_page_id, 
            link 
           ) 
          SELECT 
           p.page_id, 
           @link 
          FROM 
           sites.pages p 
          WHERE p.page_url = @url"; 
+0

あなたの完全に正しい。私はそれをやっていなかったとは思えない。それは日にあった。ご協力ありがとうございました。 – jgetner

0

あなたの書式設定が、これは私が使用してるものです...奇妙です。あなたが選択しているテーブル(sites.links)はクエリのどこでも使用されていません。これは右ジョインでは使用されないことを意味します。つまり、右ジョインではなくクロスジョインです。

あなたは正確に何をしようとしています、私は非常に失われています。

あなたがどのような入力を得ているのか、どのような出力が期待できるのかを表示したほうがよいでしょう。

+0

私は、ページテーブルからURLと一致するページIDを取得しようとしていて、そのページIDとリンク文字列をリンクテーブルに挿入しようとしています。 – jgetner

+0

@jgetner - 私はsergが参加を全く使わないことを示したのを見ています。私にはそうかもしれないようでしたが、わかりませんでした。 – Hogan

関連する問題