【发布时间】:2018-05-03 02:36:09
【问题描述】:
问题总结:
我正在使用 Python 从循环中向数据库(一个接一个)发送一系列查询,直到找到一个非空的结果集。该查询具有三个必须满足的条件,它们被放置在 where 语句中。循环的每次迭代都会更改和操作条件,从特定条件变为更通用的条件。
详情:
假设条件是基于按准确度排序的预制列表的关键字,例如:
Option KEYWORD1 KEYWORD2 KEYWORD3
1 exact exact exact # most accurate!
2 generic exact exact # accurate
3 generic generic exact # close enough
4 generic generic generic # close
5 generic+ generic generic # almost there
.... and so on.
在数据库方面,我有一个描述列,它应该包含所有三个关键字的特定形式或通用形式。当我在 python 中运行循环时,这就是实际发生的情况:
-- The first sql statement will be like
Select *
From MyTable
Where Description LIKE 'keyword1-exact$'
AND Description LIKE 'keyword2-exact%'
AND Description LIKE 'keyword3-exact%'
-- if no results, the second sql statement will be like
Select *
From MyTable
Where Description LIKE 'keyword1-generic%'
AND Description LIKE 'keyword2-exact%'
AND Description LIKE 'keyword3-exact%'
-- if no results, the third sql statement will be like
Select *
From MyTable
Where Description LIKE 'keyword1-generic%'
AND Description LIKE 'keyword2-generic%'
AND Description LIKE 'keyword3-exact%'
-- and so on until a non-empty result set is found or all keywords were used
我正在使用上述方法以最少的不相关结果获得最准确的结果(关键字越通用,出现的不相关结果就越多,它们需要额外的处理)
问题:
我上面的方法正是我想要的,但我确信它效率不高。
在查询而不是 Python 循环中执行此操作的正确方法是什么(知道我只有对数据库的读取访问权限,因此无法存储过程)?
【问题讨论】:
-
我认为您的数据模型有问题。您似乎在一列中存储多个关键字,而正确的方法是另一个表,每个选项和关键字一行。
-
这样你肯定会得到更少的结果。您还可以查询 3 * generic 并在您的 sql 中计算一个“分数”——程序只会使用最高分数——但你会得到更多必须过滤的结果——这将导致对D b。最高分将达到 3*exact,其次是任何 2*exact 和 1*generic 等
-
@GordonLinoff 我无法控制数据库的问题。描述列包含三个产品的名称(三个关键字)。产品名称由多个用户输入数据库,他们通常以不同的方式编写产品(灵活命名法)。例如,如果我们的产品是 iPhone,我对 iPhone X 感兴趣作为关键字 1,它可以写成:iPhone X 或 iPhone 10 或 iPhone-10 或 iPhone10 或 iPhone-X 但如果没有找到,我会说“iPhone”是最通用的。其他两个关键字用于附带的附加组件,也可以用不同的方式编写。
-
您是真的在不同的表中搜索还是在单个表中搜索行?
-
@OlivierJacot-Descombes 单表。
标签: python sql sql-server sql-like