我不知道是否可以在一个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列封装在'...'中并在其前面添加一个+,我也可以在全名上获得更高的匹配率。
答案 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:
答案 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;
您可能需要创建仅包含上面两列的单独表格,然后将它们连接回客户和项目表以查找更多数据。