2011-03-07 55 views
1

我们有一个web项目,有一些选择题和注册用户回答他们...
我想找到两个用户的共同答案给予一个对比。我的意思是,登录的用户会去一些其他用户的个人资料页面,看看他们的答案只有他们共同的问题比较...什么是在表中找到共同行的最佳方式

中的表像(简体):

问题
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 

questions.question和answers.answer会从缓存中取......在这种情况下被动的问题将是一个问题,但我想我会尝试移动被动的问题哟一些备份的数据库,将复杂的事情......

+0

正如一个侧面说明,你要Y'的'枚举和'N'时,你可以有一个'BIT'代替,让你有'TRUE '和'FALSE'。只是一个想法。 – corsiKa 2011-03-07 22:28:50

+0

'answer.id'是主键吗?或每个问题唯一? – 2011-03-08 01:55:36

+0

@glowcoder:旧习惯... MySQL 5.0.5中为InnoDB添加了BIT支持,因此ENUM更快,所以我仍然继续使用ENUM,但我会考虑它,谢谢... – madpoet 2011-03-08 21:42:56

回答

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 

没有测试它,但你应该明白了吧!

希望这个作品出来你...

相关问题