0

用語についてはよくわかりませんが、基本的には、次のように 2 つのテーブルを左に結合しています。

Snippets Table
snippet_id PK
snippet_text

snippets_link_email_id Table
snippet_id * (Links to Snippets Table)
email_id * (Links to emails Table)

emails Table
email_id 
version_no

その他各種データ多数

つまり、ログが解析されて email テーブルに挿入され、各レコードにはログ テキストに関する詳細、検出されたエラー、およびユーザーに関するさまざまな情報が含まれています。

各ログから必要な主な情報はエラーです。各固有のエラーはスニペット テーブルに保存されます。

同じエラーのメールが多数ある可能性があるため、次のクエリを実行して、一意のエラーがいくつあったかを確認します。

$total_exception_check = mysql_query("SELECT * FROM snippets");
$total_exceptions = mysql_num_rows($total_exception_check);

while ($row = mysql_fetch_array($total_exception_check))
{
$i = $row['snippet_id'];
//Need to find total occurrences of this error

$feedback_query = mysql_query("SELECT * FROM snippets LEFT JOIN snippets_link_email_id ON snippets.snippet_id = snippets_link_email_id.snippet_id WHERE snippets_link_email_id.snippet_id = $i AND snippet_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP");
}
$tot_snippets = mysql_num_rows($feedback_query);

したがって、私は基本的に各固有のエラーをループしてから、snippets_link_email_id テーブルを検索して、そのエラーが記録された回数、つまり解析された電子メールにそのエラーがあった回数を確認します。

tot_snippets は、それぞれの合計金額を教えてくれます。これで、各エラーとそれが記録された回数の表を作成できるようになりました。

ただし、電子メール テーブルにはバージョン番号を含む多くの情報があります。電子メール テーブルの version_no の値が 2000 である一意のエラーの合計を取得したい場合はどうすればよいでしょうか。

それを確認するには、このコードをどのように編集すればよいでしょうか?

SELECT *
FROM snippets
LEFT JOIN snippets_link_email_id
    ON snippets.snippet_id = snippets_link_email_id.snippet_id
WHERE
    snippets_link_email_id.snippet_id = $i
    AND snippet_date BETWEEN
        CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR
        AND CURRENT_TIMESTAMP

私は他の同様の投稿からこれを試しましたが、私は何マイルも離れていると推測しています:

 SELECT *
 FROM snippets, emails
 LEFT JOIN snippets_link_email_id
     ON snippets.snippet_id = snippets_link_email_id.snippet_id
     AND snippets_link_email_id.email_id ON emails.email_id
 WHERE snippets_link_email_id.snippet_id = $i
 AND snippet_date BETWEEN
     CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP
4

2 に答える 2

1

複数のテーブルを結合するための一般的な形式は次のとおりです。

SELECT (columns or collations)
FROM table1
LEFT JOIN table2
ON (some condition that associates rows in table1 with rows in table2)
LEFT JOIN table3
ON (some condition that associates rows in table1 or table2 with rows in table3)
WHERE (whatever you want to limit the result set to)

結合するテーブルの数に関係なく、同じ基本パターンに従いますが、多くのテーブルを使用している場合は、テーブルのエイリアスを作成すると作業がずっと簡単になります。

SELECT (columns or collations)
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON (some condition that associates rows in t1 with rows in t2)
LEFT JOIN table3 AS t3
ON (some condition that associates rows in t1 or t2 with rows in t3)
WHERE (whatever you want to limit the result set to)
于 2013-01-23T09:16:00.570 に答える
1

メールに正しく参加すると解決しますか?

 SELECT *
 FROM snippets
 LEFT JOIN snippets_link_email_id
 ON snippets.snippet_id = snippets_link_email_id.snippet_id
 LEFT JOIN emails
 ON snippets_link_email_id.email_id = emails.email_id
 WHERE snippets_link_email_id.snippet_id = $i
 AND snippet_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP");

また、最初のクエリでタイムスタンプが使用されていないことに気付きました。それはあなたが本当に必要とするよりも多くの行を返します(私は推測します)。最初のクエリをタイムスタンプでフィルタリングすると、ループが大幅に小さくなります。

SELECT * FROM snippets
     WHERE snippet_date BETWEEN CURRENT_TIMESTAMP - INTERVAL '$num_days' HOUR AND CURRENT_TIMESTAMP");
于 2013-01-23T09:16:50.503 に答える