我有一个表包含两个这样的列。 (项目名称和项目描述)
item_name item_des
jasmine beautiful flower & nice smell
rose flower
orange gud fruit
apple fruit
books books
我希望根据项目名称&amp ;;找到此表中的匹配项目。描述即, 例如,结果应该是:
item_name item_des
jasmine beautiful flower & nice smell
rose flower
或
item_name item_des
orange gud fruit
apple fruit
我怎样才能在sql中做到这一点?
我没有任何项目名称或描述。我只想获得具有相似项目名称或类似描述的表格的所有内容。
答案 0 :(得分:1)
在阅读了对其他答案的评论后,我得出结论,你想要的是从表中获取行集,并希望每个集在item_des列中具有相似的值。至少那是你的例子所呈现的。
问题在于你定义'相似'的方式。据我所知,您不希望为查询提供任何其他数据来定义您正在寻找的相似性。 AshReva和Naryl假设你这样做。这就是他们建议您在查询中使用LIKE '%flower%' or LIKE 'fruit'
的原因。
我想你要求的是如何获得列表('fruit', 'flower', ...)
,因为你没有列表token
fruit
books
beautiful
flower
&
nice
smell
gud
fruit
flower
。您需要一个可以找到一个查询的查询。
这不是一件容易的事,它需要你做出一些决策。任务相当复杂,因此我不打算提供准备好运行的解决方案。我将介绍一些你需要做的相当简单的步骤。
首先,您需要对item_des字段进行标记。你想要的是另一个名为t的表,其中包含一个字段,例如称为令牌。在对您的示例进行标记后,您应该获得如下表格:
distinct
您可能必须编写自己的标记化功能。点击这里: Is there something analogous to a split() method in mySql?
然后删除重复项(在列上执行select item_name, item_des, token
from input_data, t
where item_des like concat('%',t.token,'%')
order by token
)。所以你得到:
代币
水果
图书
美丽
花
&安培;
不错
闻
GUD
然后你可能想以某种方式删除无效的令牌。您可以手动执行此操作。您可以针对某些关键字或字典进行自动匹配。您可以应用一些启发式方法,例如删除长度为1个字符的标记。
之后你只需在两个表之间进行匹配,原始表(假设它被称为input_data)和最终表t,其中包含你的标记:
item_name item_des token
jasmine beautiful flower & nice smell beautiful
jasmine beautiful flower & nice smell &
jasmine beautiful flower & nice smell nice
jasmine beautiful flower & nice smell smell
rose flower flower
jasmine beautiful flower & nice smell flower
orange gud fruit gud
orange gud fruit fruit
apple fruit fruit
books books books
然后你应该得到类似的东西:
{{1}}
我希望这就是你所需要的。
答案 1 :(得分:-2)
请尝试以下代码:
select * from table_name where item_name like '%flower%' or item_des like '%flower%'
答案 2 :(得分:-3)
可以通过以下方式完成:
SELECT * FROM item WHERE item_des LIKE '%flower%'