Mysql 我希望得到投相同票的选民

Mysql 我希望得到投相同票的选民,mysql,sql,Mysql,Sql,我有4张桌子: 使用者 民意测验 投票选择 投票 给定一个指定用户,如何获取为指定用户回答的投票选择相同选项的所有其他用户 理想情况下,它将根据回答相同的问题的数量提供一个用户降序列表,即投票完全相同的用户将位于顶部,而没有共同答案的用户将位于底部 SELECT u.first_name, u.last_name, v.Answers FROM Users AS u LEFT JOIN ( SELECT pv.user_id AS user, COUNT(*) AS Answers

我有4张桌子:

使用者 民意测验 投票选择 投票 给定一个指定用户,如何获取为指定用户回答的投票选择相同选项的所有其他用户

理想情况下,它将根据回答相同的问题的数量提供一个用户降序列表,即投票完全相同的用户将位于顶部,而没有共同答案的用户将位于底部

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

内部查询选择与所选用户具有相同轮询id、选项id组合的所有用户。每个用户的行数是常见答案的数目。与用户表的左侧连接是将结果中没有常见答案的用户包括在内。

还有另一种方法:

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;

这两个内部查询是相同的,实际上可以转换为一个视图。外部查询只是将问题/答案列表上的两个字段连接起来以获得匹配项。

在投票表中,您有字段Poll\u id和option\u id。记录id为4的记录有Poll\u id 2和option\u id 1。表轮询选项中的哪个记录由这些id表示并不明显,因为记录\u id 1具有轮询\u id 1。如果您从poll Votes表中ommit poll_id列,并让option_id列成为poll Options record_id的键,那就更好了。谢谢pinouchon!在内部查询中考虑了它,但在左连接中错过了它。
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
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
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;