我们有一个网络项目,有一些多项选择题,注册用户回答它们。
我想找到两个用户的常见答案进行比较。我的意思是,登录的用户将转到其他用户的个人资料页面,只看到他们的答案的比较,仅针对他们的常见问题......
表格就像(简化):
问题
ID
问题
有效 - >枚举('Y','N')
答案
ID
question_id
答案
用户
ID
尼克
user_answers
USER_ID
question_id
answer_id
私人 - >枚举('Y','N')
我可以通过给出别名来加入user_answers表,但我也必须加入其他表。不应考虑私人答案,只应采取积极的问题......
该网站预计会有一些负载,所以我担心有太多的连接和条件。根据我的经验,我知道这些复杂的查询可能会锁定表并导致一些严重的性能问题,尤其是在负载很重的情况下......
因此,考虑到可扩展性和性能时,最佳做法是什么? 会smt。像狮身人面像或太阳能帮助,或任何基于软件的解决方案进行比较?
结果将按照方式分页......
现在我正在考虑分离问题详细信息并回答详细信息并缓存它们,因此查询将是smt。像:
select ua1.answer_id as her_answer_id,
ua2.answer_id as my_answer_id,
ua1.question_id
from user_answers ua1
inner join users_answers ua2 on ua1.question_id=ua2.question_id
where ua1.user_id=$herId
and ua2.user_id=$myId
and ua1.private='N'
order by ua1.question_id desc
问题。问题和答案。将从缓存中获取...在这种情况下,被动问题将是一个问题,但我想我会尝试移动被动问题,因为某些备份数据库会使事情复杂化......
答案 0 :(得分:0)
我会在查询中使用条件:
select
user_answers.question_id `QuestionId`,
max(if((user_answers.user_id = my_id), user_answers.answer_id, 0)) `MyAnswer`,
max(if((user_answers.user_id = other_id), user_answers.answer_id, 0)) `OtherAnswer`
from users_answers
where user_answers.private = 'N'
and user_answers.user_id IN(myid, orderid)
group by users_answers.question_id
having count(*) = 2
order by user_answers.question_id
没有测试过,但你应该明白这个想法!
希望这对你有用......