Хранимая процедура SQL - PullRequest
4 голосов
/ 26 марта 2011

У меня есть 3 таблицы:

  • tbl_Image, из которых будет получен список всех изображений
  • A user таблица, из которой будет получен идентификатор пользователя
  • и таблица ассоциации Image и Member с именем tbl_MemberAssociation.

Мой рабочий процесс заключается в том, что пользователь может загрузить изображение, и оно будет сохранено в таблице изображений.Затем все пользователи могут просмотреть это изображение и выбрать один из трех вариантов, представленных вместе с изображением.Если пользователь выбирает опцию, он будет добавлен в таблицу ассоциаций.Ни один пользователь не может смотреть одно и то же изображение более одного раза.Поэтому нескольких записей там не будет.

Теперь я хочу найти% совпадения, получив список участников, выбрав ту же опцию и другую опцию, соответствующую всем распространенным изображениям, для которых они предоставили свою опцию.

То есть, если 3 пользователя говорят, что А, В и С просматривают изображение Таймахала.Если A и B выбрали красивый как выбор, а C как «Не хорошо».Для другого изображения скажем, что индийский флаг AB и C выбрали то же самое, что и Salute.Тогда для пользователя A: B соответствует 100% (так как они выбирали одну и ту же опцию оба раза).Для A: C 50% соответствуют одному из 2 одинаковых.

Так что это мой сценарий, в котором я должен найти все совпадающие, соответствующие текущему вошедшему в систему пользователю.

Пожалуйста, помогите мне .... Я полностью обеспокоен этой процедурой.*

1 Ответ

0 голосов
/ 25 июня 2011

Я сделал некоторые предположения относительно фактической структуры ваших таблиц, но если я пойму, что вы ищете, то я думаю, что этот запрос даст желаемые результаты.Возможно, вам придется внести несколько изменений, чтобы соответствовать структурам вашей таблицы.

    SELECT
        matches.UserName,
        CAST(matches.SameRatings AS FLOAT) / CAST(ratings.UserRatingCount AS FLOAT) AS MatchPercent
    FROM 
        tbl_User
    CROSS APPLY
    (
        SELECT
            COUNT(*) UserRatingCount
        FROM 
            tbl_MemberAssociation
        WHERE 
            UserId = tbl_User.UserId
    ) ratings
    CROSS APPLY
    (
        SELECT
            u1.UserId,
            u1.UserName,
            COUNT(*) AS SameRatings
        FROM 
            tbl_MemberAssociation ma
        INNER JOIN 
            tbl_MemberAssociation ma1 
        ON
            ma.ImageId = ma1.ImageId 
        AND ma.Rating = ma1.Rating 
        AND ma.UserId <> ma1.UserId
        INNER JOIN 
            tbl_User u1 
        ON 
            ma1.userId = u1.UserId
        WHERE 
            ma.UserId = tbl_User.UserId
        GROUP BY
            u1.UserId,
            u1.UserName
    ) matches
    WHERE
        tbl_User.UserId = @UserId
    ORDER BY
        MatchPercent DESC

@ UserId может быть передан в качестве входных данных для хранимой процедуры.

1-е "ПРИЛОЖЕНИЕ КРЕСТА" "оценки"получение подсчета для общего количества оценок для вошедшего в систему пользователя.

2-е ПРИЛОЖЕНИЕ CROSS "совпадения" - это подсчет количества одинаковых оценок для других пользователей в базе данных.

В результирующем наборе используется число, рассчитанное по двум запросам CROSS APPLY, для вычисления процента совпадения между вошедшим в систему пользователем и другими пользователями, которые оценили те же изображения, что и вошедший в систему пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...