Mysql 如何从userID不同的表中选择userID和user

Mysql 如何从userID不同的表中选择userID和user,mysql,sql,userid,Mysql,Sql,Userid,我有一个表,其中所有的userID都不同,因为我需要一个主键,但是98个不同的userID链接到一个用户名。我需要从名为studenttable的数据库中选择一个用户,但仍要调用userID 这是该表的一个较短示例: **UserID Username Year Form Subject1 Subject2 Subject3 Subject4** 1 John 13 D Art French

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

这是该表的一个较短示例:

    **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
等等

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

我希望结果表如下所示:

  UserID       Username     Year    Form    Subject 
    1           John         13      D       Psychology
   296          Henry        13      D       Psychology
任何帮助都将不胜感激,
感谢下面的聚合器
MIN
是任意的,它将为相同的记录选择最小的值。如果需要,请使用任何其他聚合器,例如
MAX

SELECT MIN(UserId), Username, Year, Form, Subject1, Subject2, Subject3, Subject4
FROM studenttable 
GROUP BY Username, Year, Form, Subject1, Subject2, Subject3, Subject4

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

SELECT MIN(UserId), Username, Year, Form, Subject1, Subject2, Subject3, Subject4
FROM studenttable 
GROUP BY Username, Year, Form, Subject1, Subject2, Subject3, Subject4

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

SELECT MIN(UserId), Username, Year, Form, Subject1, Subject2, Subject3, Subject4
FROM studenttable 
GROUP BY Username, Year, Form, Subject1, Subject2, Subject3, Subject4

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

SELECT MIN(UserId), Username, Year, Form, Subject1, Subject2, Subject3, Subject4
FROM studenttable 
GROUP BY Username, Year, Form, Subject1, Subject2, Subject3, Subject4
我想从数据库中选择符合特定条件的所有用户 标准,例如,他们必须在第13年,在表D和do中 心理学是他们的一门学科。然后我只想显示其中一个 具有相同用户名的用户

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

    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查询中用于从结果集中删除重复项

我想从数据库中选择符合特定条件的所有用户 标准,例如,他们必须在第13年,在表D和do中 心理学是他们的一门学科。然后我只想显示其中一个 具有相同用户名的用户

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

    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查询中用于从结果集中删除重复项

我想从数据库中选择符合特定条件的所有用户 标准,例如,他们必须在第13年,在表D和do中 心理学是他们的一门学科。然后我只想显示其中一个 具有相同用户名的用户

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

    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查询中用于从结果集中删除重复项

我想从数据库中选择符合特定条件的所有用户 标准,例如,他们必须在第13年,在表D和do中 心理学是他们的一门学科。然后我只想显示其中一个 具有相同用户名的用户

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

    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查询中用于从结果集中删除重复项。

表中的问题是,主题可以位于四列
Subject1 Subject2 Subject3 Subject4
中的任何列中,为此,您可以像这样使用
in
谓词:

WHERE 'Psyhcology' IN(Subject1, Subject2, Subject3, Subject4)
因此,您的完整查询将是:

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));
注意:此查询将为
名称提供重复的行
,因为您有多个具有不同id的名称:

╔═════════╦═══════════╦═══════╦═══════╦════════════╗
║ 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)

这将为您提供:

╔═════════╦═══════════╦═══════╦═══════╦════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║  SUBJECT   ║
╠═════════╬═══════════╬═══════╬═══════╬════════════╣
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology ║
║      1  ║ John      ║   13  ║ D     ║ Psyhcology ║
╚═════════╩═══════════╩═══════╩═══════╩════════════╝

但是,我更希望通过为
主题创建一个新的表来替换该表:

主题

  • subject
    PK
  • SubjectName
然后,您的桌子看起来像:

  UserID       Username     Year    Form    Subject 
    1           John         13      D       Psychology
   296          Henry        13      D       Psychology
  • UserId
  • 用户名
  • 年份
  • 表格
  • SubjectId
    外键引用subjects表
这将使查询这两个表变得更容易。例如,如果要搜索选择特定主题的用户,只需将两个表合并即可:

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;
这将为您提供与以前相同的结果:

╔═════════╦═══════════╦═══════╦═══════╦═════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║ SUBJECTNAME ║
╠═════════╬═══════════╬═══════╬═══════╬═════════════╣
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology  ║
║      1  ║ John      ║   13  ║ D     ║ Psyhcology  ║
╚═════════╩═══════════╩═══════╩═══════╩═════════════╝
下面是一个演示,演示了修改后的表结构:


表中的问题是,主语可以位于四列
Subject1 Subject2 Subject3 Subject4
中的任何一列,为此,您可以使用
中的
谓词,如下所示:

WHERE 'Psyhcology' IN(Subject1, Subject2, Subject3, Subject4)
因此,您的完整查询将是:

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));
注意:此查询将为
名称提供重复的行
,因为您有多个具有不同id的名称:

╔═════════╦═══════════╦═══════╦═══════╦════════════╗
║ 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)

这将为您提供:

╔═════════╦═══════════╦═══════╦═══════╦════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║  SUBJECT   ║
╠═════════╬═══════════╬═══════╬═══════╬════════════╣
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology ║
║      1  ║ John      ║   13  ║ D     ║ Psyhcology ║
╚═════════╩═══════════╩═══════╩═══════╩════════════╝

但是,我更希望通过为
主题创建一个新的表来替换该表:

主题

  • subject
    PK
  • SubjectName
然后,您的桌子看起来像:

  UserID       Username     Year    Form    Subject 
    1           John         13      D       Psychology
   296          Henry        13      D       Psychology
  • UserId
  • 用户名
  • 年份
  • 表格
  • SubjectId
    外键引用subjects表
这将使查询这两个表变得更容易。例如,如果要搜索选择特定主题的用户,只需将两个表合并即可:

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;
这将为您提供与以前相同的结果:

╔═════════╦═══════════╦═══════╦═══════╦═════════════╗
║ USERID  ║ USERNAME  ║ YEAR  ║ FORM  ║ SUBJECTNAME ║
╠═════════╬═══════════╬═══════╬═══════╬═════════════╣
║    296  ║ Henry     ║   13  ║ D     ║ Psyhcology  ║
║      1  ║ John      ║   13  ║ D     ║ Psyhcology  ║
╚═════════╩═══════════╩═══════╩═══════╩═════════════╝
下面是一个演示,演示了修改后的表结构:


您表格中的问题是主题可以位于四列
主题1主题2主题3主题4
中的任何一列,因此您可以使用