【问题标题】:MySql Get voters who voted the sameMySql 获取投票相同的选民
【发布时间】:2011-08-22 08:25:36
【问题描述】:

我有 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

给定一个指定的用户,我如何让所有为指定用户回答的投票选择相同选项的其他用户。

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

【问题讨论】:

  • 在您的“投票投票”表中,您有字段 poll_id 和 option_id。 record_id 4 的记录具有 poll_id 2 和 option_id 1。由于 record_id 1 具有 poll_id 1,因此这些 id 表示表“投票选项”中的哪条记录并不明显。如果您省略“投票投票”表中的 poll_id 列会更好并让 option_id 列成为“投票选项”record_id 的关键。

标签: mysql sql


【解决方案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

内部查询选择与所选用户具有相同(poll_id, option_id) 组合的所有用户。每个用户的行数是常见答案的数量。与用户表的左连接是在结果中包含没有共同答案的用户。

【讨论】:

  • 感谢 pinouchon!在内部查询中考虑过,但在左连接中错过了。
【解决方案2】:

这是另一种方法:

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;

这两个内部查询是相同的,实际上可以变成一个视图。外部查询只是将问题/答案列表中的两者连接起来以获取匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2020-01-20
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多