5

2 つの mysql テーブルがあります。1 つは悪い言葉のリストで、もう 1 つは悪い言葉のリストと比較するためのテーブルです。基本的に、悪い単語テーブルに単語がまったく出現ないドメインを含む行のリストを除外して返したいと考えています。いくつかのサンプル テーブル:

悪い言葉リスト

+----------+------------------+
| id       | words            |
+----------+------------------+
| 1        | porn             |
| 2        | sex              |
+----------+------------------+

比較するドメインの表

+----------+------------------+
| id       | domain           |
+----------+------------------+
| 56       | google.com       |
| 57       | sex.com          |
+----------+------------------+

などの結果を返したい

+----------+------------------+
| id       | domain           |
+----------+------------------+
| 56       | google.com       |
+----------+------------------+

注意すべきことは、これらの表には共通点がないため、これが最善の方法であるかどうかさえわかりません。私PHPで比較関数を使用していましたが、数十万行を検索するには遅すぎるようでした。

4

2 に答える 2

4

mysqlから取得可能です。このような:

SELECT
    d.*
FROM 
    domains d 
LEFT JOIN
    words w ON(d.domain LIKE CONCAT('%',w.word,'%') ) 
GROUP BY
    d.domain
HAVING
    COUNT(w.id) < 1

しかし、これは最適ではなく、両方のテーブルにレコードが増えると、ますます遅くなります。

于 2012-12-27T15:17:31.260 に答える
4

このようなデータは通常、フェッチ時ではなく挿入時に事前に計算する必要があります。「bad_words boolean default null」のような列を Domains に追加する必要があります。

null は「わからない」を意味し、コンテキストによっては「表示するのが安全でない」と解釈される可能性があります。false は「悪い言葉がない」ことを意味し、true は「悪い言葉が含まれている」ことを意味します。

不適切な単語のリストが更新されるたびに、すべての列が null にリセットされ、いくつかのバックグラウンド作業が再びそれらの処理を開始します。おそらくSQL以外の言語です。

于 2012-12-27T15:07:48.653 に答える