2014-06-09 83 views
-1

我有一個小型數據庫,有些用戶需要回答10個問題:我想比較男性和女性用戶,並返回一定比例的對於每對夫婦匹配的答案:PHP + MySQL:比較數據庫中的行,以獲得匹配字段的百分比

我的數據庫是一個非常簡單的:

表:USERS

ID_user(INT), name(VARCHAR), gender (M or F), answer1(VARCHAR), ..., answer10 

我還創建一個表來存儲先前的匹配結果(所以我不會有積極的通過查看匹配是否已經匹配兩次存儲在此表)

表:MATCH

ID_match, ID_user(M), ID_user(F), match_date 

例:

male1 answered: 1,2,3,1,2,3,4,3,2,3 
male2 answered: 5,2,2,1,5,3,3,3,1,3 

female 1 answered: 1,1,3,1,4,3,1,3,2,2 
female 2 answered: 4,2,3,1,2,6,4,3,6,3 

結果:

match male1-female1 = 6 
match male1-female2 = 7 
match male2-female1 = 3 
match male2-female2 = 4 

我還需要發送一些電子郵件,誰擁有匹配的百分比超過60%;所有這些將被整合到wordpress網站中,但這是一個次要問題:p

請幫忙。在此先感謝

+0

如果你能控制你的數據庫,那麼最好的方法就是重新設計你的數據庫。規範化的版本將有兩個表格用於記錄人員,一個用於答案(ID_answer(INT),用戶(INT),answer_number(INT),answer_chosen(INT))。你會發現這個問題更容易通過規範化的數據庫結構來解決 – Sqoo

+0

在我的第一個數據庫思想中,有更多的表格,比如:問題,答案,用戶,匹配等。 – user3722661

+0

數據庫有最佳設計,可以產生最大效率,靈活性並保存數據的完整性。你應該使用兩個表格而不是一個表格的原因可以通過簡單的改變來說明有11個問題。在你的設計中,你將不得不改變桌子,而用兩張桌子你不需要改變任何東西。這個過程稱爲標準化,值得一讀。 – Sqoo

回答

0

你不得不做,在一個醜陋的方式,用嵌套查詢和自聯接

內部查詢:

SELECT 
    t1.ID_user AS user1, t2.ID_user AS user2 
    t1.answer1 = t2.answer1 AS a1, 
    t1.answer2 = t2.answer2 AS a2, 
    ... 
    t1.answer10 = t2.answer10 AS a10 
FROM users AS t1 
INNER JOIN users AS t2 ON t1.id <> t2.id AND (t1.gender <> t2.gender) 

這給你人物間的基本清單比賽中,與比賽0/1

你會再環繞此另一個查詢:

SELECT user1, user2, (a1 + a2 + .... + a10) AS matched_answers 
FROM (... other query here ...) AS q 
WHERE matched_answers >= 6 
ORDER BY matched_answers DESC 

您總結了子查詢的答案,按降序排序,並只返回匹配6個以上答案的分組。

而後來,如果您決定允許同性戀者匹配,您只需將性別匹配從聯接條款中刪除。

+0

非常感謝,我會盡快解決你的問題:) – user3722661

0

@馬克-B 嗨,經過多天,我終於成功地在此表上重新工作,我的最終工作查詢(感謝您的建議)是:

SELECT 
t1.ID_user AS user1, t2.ID_user AS user2, 
((t1.r1 = t2.r1) + (t1.r2 = t2.r2) + (t1.r3 = t2.r3) + (t1.r4 = t2.r4) + (t1.r5 = t2.r5) + (t1.r6 = t2.r6) + (t1.r7 = t2.r7) + (t1.r8 = t2.r8) + (t1.r9 = t2.r9) + (t1.r10 = t2.r10)) AS matched_answers, 
t1.r1 = t2.r1 AS a1, 
t1.r2 = t2.r2 AS a2, 
t1.r3 = t2.r3 AS a3, 
t1.r4 = t2.r4 AS a4, 
t1.r5 = t2.r5 AS a5, 
t1.r6 = t2.r6 AS a6, 
t1.r7 = t2.r7 AS a7, 
t1.r8 = t2.r8 AS a8, 
t1.r9 = t2.r9 AS a9, 
t1.r10 = t2.r10 AS a10 
FROM a_answers AS t1 
INNER JOIN a_answers AS t2 ON t1.ID_answer <> t2.ID_answer AND t1.gender <> t2.gender WHERE t1.gender = "f" HAVING matched_answers >= 6 ORDER BY user1, user2 

,並像一個魅力的工作

非常感謝

相關問題