5

我有两个mysql表。一个是坏词列表,另一个是与坏词列表进行比较的表格。本质上,我想过滤掉并返回一个包含在坏词表中没有出现任何单词的域的行列表。几个示例表:

坏话列表

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

要比较的域表

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

我想返回结果,例如

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

需要注意的是,这些表没有任何共同点,所以我什至不确定这是最好的方法。我在 PHP使用了一个比较函数,但是在搜索数十万行时这似乎太慢了。

4

2 回答 2

4

像这样的数据通常需要在插入时而不是在获取时预先计算。您应该向 Domains 添加一列,例如“bad_words boolean default null”。

null 表示“不知道”,在某些情况下可以解释为“不安全显示”。false 表示“没有坏话”,而 true 表示“包含坏话”。

每次更新坏词列表时,所有列都会重置为空,并且一些后台工作将再次开始处理它们。可能是sql以外的另一种语言。

于 2012-12-27T15:07:48.653 回答
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 回答