我正在建立一个交友网站,我有一个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发现在美国(country_id=190),任何具有至少人格特征2(可能还有其他人格特征)的男性(country_id=190)都在寻找女性(gender_id=2)。
在美国,只要是22岁到53岁之间的男人,只要是性格第2型(仅限于),都要找一个女人。--
在美国,只要是22岁到53岁的男人,只要是第1型、第2型和第5型的男人,只要是在找女人。--
( 1)在美国找任何22到53岁之间的男人,这是个性类型2(仅限于)寻找一个女人。
sql将使用以下表:
用户desired_partner user_personality
user表包含我们希望从数据库获取的配置文件信息(user_id、desc、email、密码、道布、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可以与不同的个性_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_personality,其中user.user_id = user_personality.user_id和user_personality.personality_id =1
现在,假设一个成员想要搜索具有人格类型1和个性类型5的人,而没有其他人格_id与他们的user_id相关联。sql会是什么样子?
发布于 2010-05-19 09:36:33
第一个问题:
您确定您的原始查询也返回其他个性类型吗?因为您明确要求输入2。
我看不出这会给其他人带来什么好处。(这将是你第一个问题的答案)。
第二个问题:
使用IN操作符:
AND user_personality.personality_id IN ('1', '2', '5')如果这没有帮助,您应该更好地解释您的表结构,以便我们知道它们之间存在什么样的关系。
发布于 2010-06-03 22:46:04
问题1的一个解决方案
AND NOT EXISTS ( SELECT 1
FROM user_personality UP2
WHERE UP2.user_id = user.user_id
AND UP2.personality_id <> '2'
)发布于 2012-12-24 02:16:02
通过使用NOT子-选择通常是大命中性能方面的。通过在除了人格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'https://stackoverflow.com/questions/2864213
复制相似问题