2010-05-19 117 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' 
相关问题