MYSQL选择查询,其中必须存在同一列中的多个条件

时间:2010-05-19 09:19:38

标签: mysql select

我正在组建一个约会网站,我有一个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)寻找女性(country_id=190的某个年龄段之间找到任何男性(gender_id=2)具有ATLEAST个性特征2(可能还有其他性格特征) })。

  • 问题1)我如何做到这样才能归还那些只有2型人格而没有其他人格特质的人?

      
        

    在美国发现任何22岁至53岁的男性,只有2岁(仅)正在寻找女性。

      
  • 问题2)假设我想找一个与人格类型1,个性类型2和个性类型5匹配的人。数据库中有14个人格特征,用户可以与其中任何一个相关联。

      
        

    在美国找到任何一个22到53岁的男性,这个男性的性格类型为1,2和5(仅适用于寻找女性)。

      

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

1)找到22至53岁之间的任何男性,即寻找女性的2型(仅限)。

sql将使用这些表:

用户 desired_pa​​rtner user_personality

用户表包含我们想要从数据库中获取的个人资料信息(user_id,desc,email,password,dob,gender_id,country_id,state_id,city,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

问题在于:

如果会员具有个性类型1和个性类型4

,该怎么办?

这将在数据库中表示为:

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

如果我想找到人格类型为1的人,那么下面的查询将不起作用,因为它将包含user_id = 1,其中也有人格类型4。

从user,user_personality中选择*,其中user.user_id = user_personality.user_id和user_personality.personality_id = 1

现在,假设某个成员想要搜索具有个性类型1和个性类型5且没有与其user_id相关联的其他personality_id的人。 sql会是什么样的?

3 个答案:

答案 0 :(得分:2)

第一个问题:

您确定原始查询还返回其他个性类型吗?因为您明确要求输入2类型 我看不出这应该如何归还其他人物。 (所以这已经是你第一个问题的答案了。)

第二个问题:

使用IN运算符:

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

如果这没有用,你应该更好地解释你的表结构,以便我们知道它们之间存在什么样的关系。

答案 1 :(得分:0)

问题#1的解决方案

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

答案 2 :(得分:0)

通过使用NOT IN子选择通常是大打击性能。通过在任何事物上对用户个性进行额外的LEFT-JOIN但是人格ID = 2.如果找到,他们有多种人格特质,并忽略它们。如果在“UserP2”别名

中找到NULL,则仅保留
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'