我有一个问题是围绕这个弯曲。 我有一个具有以下结构的表。包含大约500万行。
Id bigint主要身份,自动增量
SKU int
关键字nvarchar(200)
KeywordType nvarchar(1)
该表分为所有可能的关键字,用于给定SKU的多种语言。因此,例如,由于不同的可接受关键字但是所有相同的SKU,指环王产品可能具有100个记录。 暂时忽略KeywordType。
问题#1:如何编写SQL查询以根据“Lord Rings”等输入返回记录?
问题#2:KeywordType字段很奇怪。它用于根据格式过滤记录,例如CD,DVD等。因此,SKU的给定结果集的KeywordType值“X”将被其值进一步过滤。
例如,用户正在使用DVD过滤器搜索“Lord Rings”。
我需要来自问题#1的结果,也只需要关键字为“DVD”和KeywordType“X”的结果。
最后,我正在寻找一个ANDed解决方案。 谢谢。希望有人能帮忙......
以下是“指环王双塔”特定SKU的一些示例数据
650446 12288 DVD F
650452 12288 LORD T
650453 12288 LTD X
650454 12288 MOVIE A
650455 12288 OF T
650457 12288 RINGS T
650460 12288 THE T
650461 12288 TOURS X
650462 12288 TOWERS T
650463 12288 TWO T
如果用户输入“Lord Rings”,那么我希望在搜索结果中返回上述SKU。
答案 0 :(得分:0)
如果KeywordType的数量有限,就像您知道所有可能的关键字类型一样,那么它作为ENUM比NVARCHAR更好。如果你不这样做,我仍然建议改为NCHAR(1)。 VARCHAR类型占用额外的空间来存储长度,因此VARCHAR(1)实际上大于CHAR(1)。
至于搜索,尝试类似:
SELECT id, SKU FROM SKUKeywords
WHERE Keyword IN ( 'lord', 'rings' )
确保将数据库中的所有关键字都设置为相同,并对任何输入执行相同操作。对于第二个,只需在WHERE子句中添加AND条件,如下所示:
SELECT id, SKU FROM SKUKeywords
WHERE Keyword IN ( 'lord', 'rings' )
AND KeywordType = 'DVD'
答案 1 :(得分:0)
确保您有关键字和KeywordType的索引!
选项1:使用循环动态构建查询。 没有指定语言这么伪代码....
foreach $var ( 'search','terms','here' ) {
$query .= "Keyword = $var AND";
}
chop last 4 characters.
SELECT SKU,COUNT(Id) AS score FROM blah
WHERE ( $query ) AND KeywordType = ?
GROUP BY SKU ORDER BY score DESC
选项2:使用IN。 (我通常发现这个更慢)
SELECT SKU,COUNT(Id) AS score FROM blah
WHERE Keyword IN ('search','terms','here' ) AND KeywordType = ?
GROUP BY SKU ORDER BY score DESC
通过'和'我假设你的意思是按SKU分组你的比赛。
GROUP BY
会给你这个。
这将为您提供匹配的记录,以及首先匹配最多关键字的记录。
Exact关键字仅匹配。如果您想要非精确,则返回使用LIKE
。喜欢500万行并不是一个真正的选择。
您还需要将数据库关键字规范化为大写或小写,并将所有用户输入关键字转换为相同的。
显然,搜索字词需要清理,但这是语言/数据库特定的。
答案 2 :(得分:0)
问题有点令人困惑,但我认为你需要:
1)解析用户输入的方法(例如“Lord Ring”)成个别关键字(例如('Lord','Ring'))。这最好是在应用程序级别完成,但可以在SQL / PSQL / TSQL中完成,即大多数SQL的任何风格。
2)像这样的SQL查询(源自Daren Schwenke的解决方案)
SELECT SKU, COUNT(*) AS Ranking
FROM tblKeyWords T1 -- or whatever the name
WHERE Keyword IN ('Lord', 'Ring') -- here the keywords
AND KeywordType = 'T' -- Optionally be specific on type
AND SKU IN ( -- filter to only take items that are DVDs
SELECT SKU
FROM tblKeywords
WHERE KeywordType = 'X' AND Keyword = 'DVD'
)
GROUP BY SKU
ORDER BY COUNT(*) DESC
注意:此结构在执行基本上是全文搜索的形式方面的有效性还有很多不足之处。通过简单地引入我们可能需要的正确索引可以帮助实现这种情况 - (关键字,SKU) - (KeywordType,Keyword,SKU)
其他一些事情可能会有所帮助,例如从索引中排除几个“噪音词”,例如“OF”,“THE”,“A”,“TO”(当然还有结尾提供的搜索条件) -users)
但总的来说,评估继续这种结构的智慧可能是一个好主意;对于手头的具体应用可能有意义,OP是唯一知道这一点的人......