首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从用户to不同的表中选择userID和user

如何从用户to不同的表中选择userID和user
EN

Stack Overflow用户
提问于 2014-01-08 10:50:17
回答 4查看 22.2K关注 0票数 1

我有一个表,当我需要一个主键时,所有的UserID都是不同的,但是98种不同的UserID链接到一个用户名。我需要从一个名为studenttable的数据库中选择一个用户,但仍然需要调用userID

这是表的一个较短的例子:

代码语言:javascript
运行
复制
    **UserID  Username   Year   Form   Subject1   Subject2    Subject3   Subject4**
      1       John      13      D      Art       French    Psychology  Religion
      2       John      13      D      Art       French    Psychology  Religion
      .
      .
      99      Fank      13      D      Maths     Art       Geography   Biology
      100     Fank      13      D      Maths     Art       Geography   Biology
      .
      .
      198     Max       12      A     Psychology  Maths    Physics     German 
      199     Max       12      A     Psychology  Maths    Physics     German 
      .
      .
      296     Henry     13      D     Psychology  Economics  French    P.E
      297     Henry     13      D     Psychology  Economics  French    P.E

等等..。

我想从符合某一标准的数据库中选择所有的用户,比如他们必须在 13form D中,并将作为他们的学科之一。然后,我只想显示一个具有相同用户名的用户。

我希望结果表看起来像:

代码语言:javascript
运行
复制
  UserID       Username     Year    Form    Subject 
    1           John         13      D       Psychology
   296          Henry        13      D       Psychology

如有任何帮助,我们将不胜感激,谢谢

EN

回答 4

Stack Overflow用户

发布于 2014-01-08 11:01:24

表中的问题是主题可以位于四列Subject1 Subject2 Subject3 Subject4的任意列中,因此可以使用IN谓词,如下所示:

代码语言:javascript
运行
复制
WHERE 'Psyhcology' IN(Subject1, Subject2, Subject3, Subject4)

这样您的完整查询将是:

代码语言:javascript
运行
复制
SELECT 
  UserId,
  UserName,
  Year,
  Form,
  'Psyhcology' AS Subject
FROM tablename
WHERE Year = 13
  AND Form = 'D'
  AND userID IN(SELECT UserID 
                FROM tablname 
                WHERE 'Psychology' IN(Subject1, Subject2, Subject3, Subject4));

注意:此查询将为Name提供重复行,因为您有多个具有不同id的名称:

代码语言:javascript
运行
复制
╔═════════╦═══════════╦═══════╦═══════╦════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║  SUBJECT   ║
╠═════════╬═══════════╬═══════╬═══════╬════════════╣
║      1  ║ John      ║   13  ║ D     ║ Psyhcology ║
║      2  ║ John      ║   13  ║ D     ║ Psyhcology ║
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology ║
║    297  ║ Henry     ║   13  ║ D     ║ Psyhcology ║
╚═════════╩═══════════╩═══════╩═══════╩════════════╝

但是,如果要获得唯一的行,则必须为每组名称选择一个id,例如,MIN(USerID)

代码语言:javascript
运行
复制
SELECT
  MIN(UserId) AS UserId,
  UserName,
  Year,
  Form,
  'Psyhcology' AS Subject
FROM users
WHERE Year = 13
  AND Form = 'D'
  AND userID IN(SELECT UserID 
                FROM users 
                 WHERE 'Psychology' IN(Subject1, 
                      Subject2, 
                      Subject3, 
                      Subject4))
GROUP BY Username, Year, Form, Subject;
  • 演示

这将给你:

代码语言:javascript
运行
复制
╔═════════╦═══════════╦═══════╦═══════╦════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║  SUBJECT   ║
╠═════════╬═══════════╬═══════╬═══════╬════════════╣
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology ║
║      1  ║ John      ║   13  ║ D     ║ Psyhcology ║
╚═════════╩═══════════╩═══════╩═══════╩════════════╝

但是,我宁愿通过为http://en.wikipedia.org/wiki/Database_normalization创建一个新的表来代替subjects

Subjects

  • SubjectId PK
  • SubjectName

那么你的桌子看起来会是:

  • UserId
  • UserName
  • Year
  • Form
  • SubjectId外键引用subjects表。

这将使查询这两个表变得更容易。例如,如果要搜索接受特定主题的用户,可以简单地加入以下两个表:

代码语言:javascript
运行
复制
SELECT 
  MIN(u.UserId) AS UserId,
  u.Username, 
  u.Year, 
  u.Form, 
  s.Subjectname
FROM users AS u 
INNER JOIN subjects AS s ON u.subjectId = s.subjectId
WHERE s.subjectname = 'Psyhcology'
  AND u.Year = 13
  AND u.Form = 'D'
GROUP BY u.Username, u.Year, u.Form, s.Subjectname;

这将给您提供与以前相同的结果:

代码语言:javascript
运行
复制
╔═════════╦═══════════╦═══════╦═══════╦═════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║ SUBJECTNAME ║
╠═════════╬═══════════╬═══════╬═══════╬═════════════╣
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology  ║
║      1  ║ John      ║   13  ║ D     ║ Psyhcology  ║
╚═════════╩═══════════╩═══════╩═══════╩═════════════╝

下面是一个带有修改后的表结构的演示:

  • SQL Fiddle演示
票数 4
EN

Stack Overflow用户

发布于 2014-01-08 10:54:37

下面的聚合器MIN是任意的,它将为相同的记录选择最小的值。如果需要,可以使用任何其他聚合器,例如MAX

代码语言:javascript
运行
复制
SELECT MIN(UserId), Username, Year, Form, Subject1, Subject2, Subject3, Subject4
FROM studenttable 
GROUP BY Username, Year, Form, Subject1, Subject2, Subject3, Subject4
票数 0
EN

Stack Overflow用户

发布于 2014-01-08 11:01:01

我想从符合某一标准的数据库中选择所有的用户,例如,他们必须在13年级和中D级,并将心理学作为他们的学科之一。然后,我只想显示一个具有相同用户名的用户。

因此,您希望从表中找到这些行:

代码语言:javascript
运行
复制
    SELECT DISTINCT(s.userId) FROM studenttable s 
    WHERE s.year = 13 AND s.form='D' 
      and (s.subject1='Psychology' OR s.subject2='Psychology' 
        OR s.subject3='Psychology' OR s.subject3='Psychology')

分异允许在SQL查询中从结果集中删除重复项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20993420

复制
相关文章

相似问题

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