我正在组建一个约会网站,我有一个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_partner user_personality
用户表包含我们想要从数据库中获取的个人资料信息(user_id,desc,email,password,dob,gender_id,country_id,state_id,city,ethnicity_id)
在desired_partner表中告诉我们用户正在寻找的伙伴(即男性,女性),主键是desired_partner_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会是什么样的?
答案 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'