2010-05-19 60 views
0

我在一起約會網站,我有一個MySQL查詢問題。MYSQL選擇查詢,其中必須存在同一列中的多個條件

這工作:

SELECT * 
FROM `user` 
    , `desired_partner` 
    , `user_personality` 
WHERE dob BETWEEN '1957-05-18' AND '1988-05-18' 
    AND country_id = '190' 
    AND user.gender_id = '1' 
    AND user.user_id = desired_partner.user_id 
    AND desired_partner.gender_id = '2' 
    AND user.user_id = user_personality.user_id 
    AND user_personality.personality_id = '2' 

的SQL發現的任何男性(gender_id=1)與美國之間存在一定的年齡範圍ATLEAST人格特質2(可能還有其他個性特徵)(country_id=190)尋找女性(gender_id=2 )。

  • 問題1)我該如何做到這一點,因此它返回那些只有性格類型2,沒有其他人格特質?

    發現在美國的任何人認爲是性格類型2(只)是找女人的22和53之間。

  • 問題2)假設我要找到匹配的性格類型1,性格類型2,和性格類型僅5人。數據庫中有14種人格特徵,用戶可以與其中的任何特徵相關聯。

    查找在美國是22和53也就是人格類型1,2和5(僅)是尋找一個女人之間的任何人。

-------添加更多的信息:

1)發現在美國是22和53是人格類型2(只)是之間的任何人尋找一個女人。

的sql將使用這些表:

用戶 desired_pa​​rtner user_personality

用戶表包含了我們希望從數據庫中抓取資料信息(USER_ID,遞減,電子郵件,密碼,出生日期,gender_id ,COUNTRY_ID,STATE_ID,市,ethnicity_id)

在desired_pa​​rtner表告訴我們什麼用戶作爲合作伙伴尋找(即男,女),主鍵是desired_pa​​rtner_id,並含有USER_ID和gender_id

在user_personality表,主鍵是user_personality_id,並含有USER_ID和personality_id需要

user_personality表,因爲爲user_id可以用不同的personality_id的相關聯。

personality_id可用於查找personality_name在性格表的定義:personality_id,personality_name

這裏的問題:

如果會員有個性型和個性型4

這將在數據庫中表示爲:

user_personality表 user_personality_id = 1 user_id = 1 personality_id = 1 user_id = 4

如果我想查找具有個性類型1的人 - 只有 - 那麼下面的查詢將無法工作,因爲它將包括user_id = 1,其中也有個性類型4。

SELECT * FROM用戶,user_personality其中user.user_id = user_personality.user_id和user_personality.personality_id = 1

現在,假設一個成員想要做的人有人格類型1和性格類型5搜索並且沒有其他的personality_id與他們的user_id相關聯。什麼樣的SQL看起來像?

+0

不能在沒有更多數據洞察的情況下回答這個問題。例如'性格類型'在哪裏存儲(什麼字段!)? – lexu 2010-05-19 09:29:41

+0

還有用戶表上的哪個字段表示用戶的偏好,例如user.desired_pa​​rtner_gender是否存在? – Ceilingfish 2010-05-19 09:35:35

回答

2

第一個問題:

你確定你原來的查詢返回還有其他性格類型?因爲您明確要求輸入2
我看不出這應該如何返回其他個性。 (所以這已經是你的第一個問題的答案)。

第二個問題:

使用IN操作:

AND user_personality.personality_id IN ('1', '2', '5') 

如果這沒有幫助,你應該解釋一下你的表結構更好,所以我們知道存在什麼樣的關係它們之間。

+0

表結構解釋多一點 – David 2010-05-21 08:39:05

0

一種問題#1

AND NOT EXISTS (SELECT 1 
        FROM user_personality UP2 
        WHERE UP2.user_id = user.user_id 
        AND UP2.personality_id <> '2' 
       ) 
0

解決方案通過使用NOT IN子選擇通常是很大的打擊性能明智的。通過在任何事情上對用戶個性進行額外的LEFT-JOIN,但是Personality ID = 2.如果發現任何人,他們有多個人格特質,並且忽略它們。只有當NULL在「UserP2」別名

SELECT 
     U.* 
    FROM 
     `user` U 
      JOIN `user_personality` UserP 
      ON U.User_ID = UserP.User_ID 
      AND UserP.Personality_ID = '2' 
      JOIN `user_personality` UserP2 
      ON U.User_ID = UserP2.User_ID 
      AND UserP2.Personality_ID != '2' 
      JOIN `desired_partner` DP 
      ON U.User_ID = DP.User_ID 
      AND DP.Gender_ID = '2' 
    WHERE 
      U.Country_ID = '190' 
     AND U.Gender_ID = '1' 
     AND U.DOB BETWEEN '1957-05-18' AND '1988-05-18' 
     AND UserP2.User_ID IS NULL 

對於第二個,只用你想要的類型的「IN」的條款中發現保持... 除非你希望確保用戶擁有所有3個性特徵。

SELECT 
     U.* 
    FROM 
     `user` U 
      JOIN `user_personality` UserP 
      ON U.User_ID = UserP.User_ID 
      AND UserP.Personality_ID IN ('1', '2', '5') 
      JOIN `desired_partner` DP 
      ON U.User_ID = DP.User_ID 
      AND DP.Gender_ID = '2' 
    WHERE 
      U.Country_ID = '190' 
     AND U.Gender_ID = '1' 
     AND U.DOB BETWEEN '1957-05-18' AND '1988-05-18' 
相關問題