2011-03-07 73 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 

沒有測試它,但你應該明白了吧!

希望這個作品出來你...

相關問題