1

我将简化我的问题以便解释它。

我有一个包含用户发布的文本消息的表和另一个包含关键字的表。

  • 我想为每个用户显示在短信中找到关键字的次数。
  • 如果在短信中找不到关键字,我不希望结果显示关键字。
  • 我不希望它不区分大小写。所有关键字都降低了,但在消息中,您可以找到较低和较高的字符。

因为我不确定我的解释是否足够清楚,所以 SQLFiddle 来了。 http://sqlfiddle.com/#!2/c402a

希望任何人都可以帮助我。

4

2 回答 2

1

我找到了我要找的东西。这对我来说并不容易,但这是我的查询:

 SELECT t_msg.msg_usr, 
        t_list.list_word, 
        count(t_list.list_word),       
        t_msg.msg_text       
 FROM t_msg
 INNER JOIN t_list
 ON LOWER(t_msg.msg_text) LIKE CONCAT("%", t_list.list_word, "%")
 GROUP BY t_msg.msg_usr, t_list.list_word;

SQLFiddle 在那里:http ://sqlfiddle.com/#!2/ba052/8

于 2013-10-23T02:55:02.257 回答
0

建议不要尝试通过查询来解决这个问题。可以编写一个查询来执行此操作,这样的查询将分别扫描每个关键字的消息表,并产生一个计数(或您可以分组的行),但这不会扩展,或者在某种意义上是可靠的的语言搜索。

以下是您可能想要做的事情:

  1. 创建一个表以将 (user_id, keyword_id) 映射到该用户的消息中该关键字的计数。我们称它为 t_keyword_count。
  2. 每次收到消息时,在将消息保存到数据库之前,搜索所有您关心的关键字(使用任何能解决拼写错误的优秀文本搜索库等)。您应该知道此消息的 (user_id)。
  3. 此时,您将准备好将消息添加到数据库中,并且将拥有一个 (keyword_id) 数组,其中包含该消息将具有的关键字。
  4. 在事务中,将消息插入到 t_msg 表中,然后运行 ​​update/insert for (user_id,keyword_id) 以使 value=value+1(或 +n,如果您需要在同一条消息中多次计算同一个关键字) 用于 t_keyword_count 表。

如果您试图解决必须对现有数据执行上述操作的问题,您可以手动执行此操作,只需先建立该 t_keyword_count 表(取决于您总共有多少关键字,但即使有很多,这可以编写脚本)。但是您应该将 t_msg.msg_text 字段更改(或镜像)为适合文本搜索的字段,并使用 SQL 文本搜索功能来查找关键字。

于 2013-10-23T02:47:41.977 回答