MySQL,从另一个字符串中的一个字符串中查找单词

时间:2010-12-12 17:52:00

标签: sql mysql

我不知道是否可以在一个SQL语句中执行此操作。我一整天都在阅读,似乎无法找到解决方案,坦率地说,我的经验只是在SQL的冰山一角。

我有两个不同的表,让我们说:物品和顾客。 两个表都有一个TEXT类型的字段(Notes),其中包含用空格和CR / LF对分隔的单词。

我需要选择所有行(items。*),其中customers.note中的任何单词都匹配items.note中的任何单词。

示例:

Table items
ID NOTES
-- ----------
1  bag candle fork
2  max kielland
3  plate knife fork
4  wheel brownbag

Table customers
ID NOTES
-- ----------
1  brown candle fork

我想要的结果是:

Items.ID Items.Note
-------- ----------
1        bag candle fork
3        plate knife fork

我一直在关注IN和LIKE(作为单独的解决方案,而不是作为一对),但它们似乎并没有完全解决问题。 如果有任何帮助,我可以确保所有空格都被','

替换

从长远来看,如果比较可以作为LIKE%..%产生如下结果,那将更加完美:

Items.ID Items.Note
-------- ----------
1        bag candle fork
3        plate knife fork
4        wheel brownbag

你可以看到棕色的棕色包被击中了。

正如我所说,我不知道在MySQL中是否可以通过PHP处理在几个问题中拆分查询。

谢谢。


更新

借助OMG Ponies MATCH..AGAINST的建议和一些PHP我解决了它。

$SQLSet = mysql_query("
  SELECT DISTINCT i.*
  FROM items i
  JOIN wanted w ON MATCH(i.notes)
  AGAINST(\"".$SQLRowWanted['Notes']." +'".$SQLRowWanted['Name']."'\")
");

这是在早期调用的$ SQLRowWanted循环内运行的。 通过将Name列封装在'...'中并在其前面添加一个+,我也可以在全名上获得更高的匹配率。

2 个答案:

答案 0 :(得分:3)

我会考虑使用全文搜索(FTS)。 MySQL has native FTS functionality使用MATCH ... AGAINST函数,但它要求列上存在全文索引。 MySQL的全文索引只能应用于MyISAM表,CHAR,VARCHAR或TEXT列。

SELECT i.id,
       i.notes
  FROM ITEMS i
  JOIN CUSTOMERS c ON MATCH(i.notes) AGAINST (c.notes IN BOOLEAN MODE)

否则,您需要查看第三方FTS:

  • 斯芬克斯
  • Solr(基于lucene)

答案 1 :(得分:1)

你的桌子没有标准化,这使得它变得更难。对于“1:bag candle fork”中的每一个,你应该有一个单独的行:

notesID | noteText
1         bag
1         candle
1         fork
2         max
2         kielland
...

然后你可以简单地做

SELECT * FROM customers, items WHERE customers.noteText = items.noteText;

您可能需要创建仅包含上面两列的单独表格,然后将它们连接回客户和项目表以查找更多数据。