假设您有表格 Photo 和表格 Word,并且使用附加表格 WordToPhoto 建立了多对多关系:
DECLARE @Photo TABLE
(ID INT, Name VARCHAR(20), Title VARCHAR(50), Description VARCHAR(200))
INSERT INTO @Photo
SELECT 1, 'mountain.jpg', 'Mountain trip', 'Mountain trip'
UNION
SELECT 2, 'beach.jpg', 'On the beach', 'On the beach'
UNION
SELECT 3, 'garden.jpg', 'Garden', 'Garden'
DECLARE @Word TABLE(ID INT, Value VARCHAR(20))
INSERT INTO @Word
SELECT 1, 'dog'
UNION
SELECT 2, 'flowers'
UNION
SELECT 3, 'sea'
UNION
SELECT 4, 'moon'
UNION
SELECT 5, 'mountain'
UNION
SELECT 6, 'seashell'
UNION
SELECT 7, 'shell'
UNION
SELECT 8, 'concert'
DECLARE @WordToPhoto TABLE(ID INT, PhotoID INT, WordID INT)
INSERT INTO @WordToPhoto
SELECT 1, 1, 2
UNION
SELECT 2, 1, 4
UNION
SELECT 3, 2, 1
UNION
SELECT 4, 2, 3
UNION
SELECT 5, 2, 6
UNION
SELECT 6, 3, 1
UNION
SELECT 7, 3, 2
然后你对“doggy”和“flower”关键字进行搜索查询:
DECLARE @Words TABLE (Word VARCHAR(20))
INSERT INTO @Words
SELECT 'doggy' UNION
SELECT 'flower'
如果您使用多个关键字进行搜索,那么您可能需要一些评级系统。我的建议是总结每张照片的分数。点将使用此算法计算:
如果照片关键字与搜索关键字相同,则 1
(狗=狗)
否则,如果照片关键字是带有后缀的搜索关键字,则为 0.75
(狗喜欢小狗)
否则,如果搜索关键字是带有后缀的照片关键字,则为 0.75
(小狗喜欢狗)
否则,如果照片关键字是带有前缀的搜索关键字,则为 0.5
(狗喜欢斗牛犬)
否则,如果搜索关键字是带有前缀的照片关键字,则为 0.5
(热狗喜欢狗)
否则,如果照片关键字是带有前缀和后缀的搜索关键字,则为 0.25
(狗喜欢史努比狗)
否则,如果搜索关键字是带有前缀和后缀的照片关键字,则为 0.25
(过分的喜欢狗)
点系数可能是其他的,这只是一个例子。
实施:
SELECT R.Rating, P.* FROM @Photo P
INNER JOIN
(
SELECT PhotoID, SUM(W.Point) AS Rating
FROM @WordToPhoto WTP
INNER JOIN (
SELECT W.ID,
CASE
WHEN (LOWER(WS.Word) = LOWER(W.Value)) THEN 1
WHEN (LOWER(WS.Word) LIKE LOWER(W.Value)+'%')
OR (LOWER(W.Value) LIKE LOWER(WS.Word)+'%') THEN 0.75
WHEN (LOWER(WS.Word) LIKE '%'+LOWER(W.Value))
OR (LOWER(W.Value) LIKE '%'+LOWER(WS.Word)) THEN 0.5
ELSE 0.25
END AS Point
FROM @Word W
INNER JOIN @Words WS ON LOWER(WS.Word) LIKE '%'+LOWER(W.Value)+'%'
OR LOWER(W.Value) LIKE '%'+LOWER(WS.Word)+'%'
) AS W ON W.ID = WTP.WordID
GROUP BY PhotoID
) AS R ON P.ID = R.PhotoID
ORDER BY R.Rating DESC
结果:
评级 ID 名称 标题 描述
1.50 3 garden.jpg 花园花园
0.75 1 mountain.jpg 山地之旅 山地之旅
0.75 2 beach.jpg 在沙滩上 在沙滩上