У меня есть проект, в котором я храню наклейки, которые есть у пользователя, и я хочу, чтобы пользователь соответствовал другим пользователям, с которыми они могут торговать.Соответствующий код на SQL Server без использования курсора
таблицы У меня есть следующая:
User
--------------
UserId
Sticker
-------------
Id
UserStickers
-------------
UserId
StickerId
Count
Пример данные:
User
-------------
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1'
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B'
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5'
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18'
Sticker
-------------
1
2
3
4
5
6
7
8
9
10
UserStickers
-------------
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1', 1, 2
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1', 2, 1
'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1', 3, 3
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 1, 3
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 2, 1
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 4, 3
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 5, 2
'F4EF0B59-81AB-41BF-8FB8-BE4E138D294B', 6, 1
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 1, 2
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 4, 3
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 8, 2
'F1A2F44A-EFD3-4AA9-8210-D4977C68E4A5', 10, 3
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 1, 1
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 4, 5
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 7, 2
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 8, 2
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 9, 2
'148CFBB4-94D5-4F85-A2BF-A155EC60DF18', 10, 2
Я хотел бы, чтобы найти лучшие матчи для данного пользователя. IE, у других пользователей есть наклейки, которых у них нет. Но мне также нужно знать, какие наклейки пользователь может предоставить другим пользователям.
Я создал функцию StickerNeeds
:
CREATE FUNCTION StickerNeeds (@UserId UNIQUEIDENTIFIER)
RETURNS @StickerNeeds TABLE
(
StickerId INT
)
AS
BEGIN
DECLARE @SearchUsersStickers TABLE
(
StickerId int
);
INSERT INTO @SearchUsersStickers
SELECT StickerId
FROM UserStickers
WHERE UserId = @UserId;
INSERT @StickerNeeds
SELECT
S.Id
FROM
Stickers S
LEFT JOIN
@SearchUsersStickers SUS
ON
S.Id = SUS.StickerId
WHERE
SUS.StickerId IS NULL
RETURN
END
Я сейчас пытаюсь написать свой соответствующий код, и я могу получить хороший топ двадцать пользователей, чтобы дать наклейки оригинального пользователя. Однако подсчет количества тех наклеек, которые им нужны в ответ, оказывается трудным без курсора, который работает медленно.
Вот что у меня сейчас есть, однако мое окончательное утверждение, чтобы сгенерировать наклейки для возврата, ничего не возвращает.
DECLARE @UserId UNIQUEIDENTIFIER = 'FFE16530-E42B-48F5-9CE2-A4D58E94C1D1'
DECLARE @UserMatches TABLE
(
UserId UNIQUEIDENTIFIER,
StickerTake int,
StickerGive int
);
INSERT INTO @UserMatches
SELECT TOP 20
UserId,
Count(*),
NULL
FROM
UserStickers US
INNER JOIN
StickerNeeds(@UserId) SUN
ON
US.StickerId = SUN.StickerId
WHERE
US.[Count] > 1
GROUP BY
UserId
ORDER BY
Count(*) DESC
-- Find Stickers to Give AND UPDATE @UserMatches
SELECT
UM.UserId,
COUNT(*) As StickerCount
FROM
(SELECT
US.StickerId AS StickerId
FROM
dbo.UserStickers US
WHERE
US.UserId = @UserId
AND US.[Count] > 1
) STG -- StickerToGive
LEFT JOIN
UserStickers US
ON
US.StickerId = STG.StickerId
LEFT JOIN
@UserMatches UM
ON
US.UserId = UM.UserId
WHERE
US.StickerId IS NULL
GROUP BY
UM.UserId
SELECT * FROM @UserMatches
В идеале @UserMatches будет содержать данный пользователь, счетчик стикера пользователя происхождения может принять и количество наклеек пользователь происхождения может дать. Я не могу вычислить значение без использования курсора.
http://stackoverflow.com/help/how-to-ask – Chris
Привет @ Chris-MayhemSoftware, что бы вы хотели, чтобы я расшириться на? –
Можете добавить некоторые тестовые (фиктивные) данные на ваш вопрос? –