MySql Получить избирателей, которые проголосовали так же - PullRequest
3 голосов
/ 22 августа 2011

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

Пользователи

record_id   first_name   last_name
1           John         Smith
2           Jim          Brown
3           Jane         Goodall

Опросы

record_id   poll_question
1           What is your age?
2           What is your occupation?

Параметры опроса

record_id   poll_id  option_text
1           1        16-20
2           1        21-25
3           2        builder
4           2        technician

Голосование по опросу

record_id   user_id   poll_id   option_id
1           1         1         1
2           1         2         1
3           2         1         2
4           2         2         1

Для указанного пользователя, как получить всех ДРУГИХ пользователей, которые выбрали одинаковые параметры для опросов, на которые ответил указанный пользователь.

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

Ответы [ 2 ]

4 голосов
/ 22 августа 2011
SELECT u.first_name, u.last_name, v.Answers
FROM Users AS u
LEFT JOIN (
    SELECT pv.user_id AS user, COUNT(*) AS Answers
    FROM PollVotes AS pv
    WHERE ((poll_id, option_id) IN
        (
            SELECT poll_id, option_id
            FROM PollVotes
            WHERE user_id = YOURUSER
        ))
    AND pv.user_id != YOURUSER
    GROUP BY pv.user_id
    ) AS v
ON u.record_id = v.user
WHERE u.record_id != YOURUSER
ORDER BY v.Answers DESC

Внутренний запрос выбирает всех пользователей с той же комбинацией (poll_id, option_id), что и выбранный пользователь.Количество строк на пользователя - это число общих ответов.Левое объединение с таблицей пользователей должно включать в результат пользователей без общих ответов.

0 голосов
/ 22 августа 2011

Вот еще один подход:

SELECT u1.record_id, u1.first_name, u1.last_name, u2.record_id comp_record_id, u2.first_name comp_first_name, u2.last_name comp_last_name, u1.options FROM (
    SELECT u.record_id, u.first_name, u.last_name, GROUP_CONCAT(pv.poll_id,'.', pv.option_id ORDER BY pv.poll_id, pv.option_id) options
    FROM users u
    INNER JOIN poll_votes pv ON pv.user_id = u.record_id
    GROUP BY u.record_id
) u1
INNER JOIN (
    SELECT u.record_id, u.first_name, u.last_name, GROUP_CONCAT(pv.poll_id,'.', pv.option_id ORDER BY pv.poll_id, pv.option_id) options
    FROM users u
    INNER JOIN poll_votes pv ON pv.user_id = u.record_id
    GROUP BY u.record_id
) u2 ON u1.options = u2.options AND u1.record_id <> u2.record_id 
WHERE u1.record_id = 1;

Два внутренних запроса идентичны и могут фактически быть превращены в представление. Внешний запрос просто объединяет два в списках вопросов / ответов, чтобы получить совпадения.

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