首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL选择必须在同一列中存在多个条件的查询

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

Stack Overflow用户
提问于 2010-05-19 09:19:37
回答 3查看 13.4K关注 0票数 0

我正在建立一个交友网站,我有一个mysql查询问题。

这样做是可行的:

代码语言:javascript
复制
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)。

  • 问题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表包含我们希望从数据库获取的配置文件信息(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会是什么样子?

EN

回答 3

Stack Overflow用户

发布于 2010-05-19 09:36:33

第一个问题:

您确定您的原始查询也返回其他个性类型吗?因为您明确要求输入2

我看不出这会给其他人带来什么好处。(这将是你第一个问题的答案)。

第二个问题:

使用IN操作符:

代码语言:javascript
复制
AND user_personality.personality_id IN ('1', '2', '5')

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

票数 2
EN

Stack Overflow用户

发布于 2010-06-03 22:46:04

问题1的一个解决方案

代码语言:javascript
复制
AND NOT EXISTS ( SELECT 1
                   FROM user_personality UP2
                  WHERE UP2.user_id = user.user_id
                    AND UP2.personality_id <> '2' 
               )
票数 0
EN

Stack Overflow用户

发布于 2012-12-24 02:16:02

通过使用NOT子-选择通常是大命中性能方面的。通过在除了人格ID = 2之外的任何东西上对用户的个性做一个额外的左连接。如果发现了任何一个,他们就有多个个性特征,并忽略它们。如果在"UserP2“别名中找到NULL,则只保留

代码语言:javascript
复制
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种性格特征。

代码语言:javascript
复制
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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2864213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档