Mysql 我希望得到投相同票的选民
我有4张桌子: 使用者 民意测验 投票选择 投票 给定一个指定用户,如何获取为指定用户回答的投票选择相同选项的所有其他用户 理想情况下,它将根据回答相同的问题的数量提供一个用户降序列表,即投票完全相同的用户将位于顶部,而没有共同答案的用户将位于底部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
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;