【问题标题】:What's the best way to find common rows in a table在表中查找公共行的最佳方法是什么
【发布时间】:2011-07-10 16:53:09
【问题描述】:

我们有一个网络项目,有一些选择题,注册用户回答它们...
我想找到两个用户的共同答案来进行比较。我的意思是,登录的用户将转到其他用户的个人资料页面,并仅查看他们对常见问题的答案的比较...

表格如下(简化):

问题
身份证
问题
活动 -> 枚举('Y', 'N')

答案
身份证
question_id
回答

用户
身份证
尼克

user_answers
用户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 将从缓存中获取...在这种情况下,被动问题将是一个问题,但我想我会尝试将被动问题转移到一些备份数据库中,这会使事情复杂化...

【问题讨论】:

  • 顺便说一句,当您可以使用BIT 时,您是否想要YN 的枚举,而让您拥有TRUEFALSE。只是一个想法。
  • answer.id 是主键吗?还是每个问题唯一?
  • @glowcoder: 只是旧习惯...... MySQL 5.0.5 中为 InnoDB 添加了 BIT 支持,因此 ENUM 更快,所以我仍然继续使用 ENUM,但我会考虑一下,谢谢.. .
  • @the-scrum-meister:answer.id 是它自己的 PK。自动递增的无符号整数,不是每个问题唯一的......我认为让每个问题唯一只会使它变得不必要的复杂......这样更容易维护数据完整性......

标签: mysql performance scalability


【解决方案1】:

我会在查询中使用条件:

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

还没有测试过,但你应该明白了!

希望这对你有用...

【讨论】:

    猜你喜欢
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    相关资源
    最近更新 更多