【问题标题】:Question about SQL Queries关于 SQL 查询的问题
【发布时间】:2011-06-29 15:35:55
【问题描述】:

我在 MySQL 数据库中有三个表

表 1 有以下字段

Name of Table: SupervisorTable 
supervisorid (autoinc, bigint) 
employeeid (bigint) //same as User.userid
supervisorname

Name of Table: User 
userid (autoinc, bigint) 
userFullName (string) 
supervisorid (bigint) 
divisionid (bigint)

Name of Table: DivisionTable 
divisionid(autoinc, bigint) 
divisionname (string)

我希望能够确定主管在哪个部门工作,我的输出应该是 主管姓名和部门名称。我最近的尝试:

SELECT supervisortable.supervisorname,
       divisiontable.divisionname 
  FROM supervisortable, 
       user, 
       divisiontable 
 WHERE supervisortable.employeeid = user.userid;

这给出了主管姓名与每个部门的每个组合:

supervisorname  divisionname
----------------------------
UserA           Department1
UserB           Department1
UserA           Department2
...
UserB           DepartmentN

【问题讨论】:

  • @Cocoa Dev:你试过什么?
  • 到目前为止你有什么?看起来你有很多。和一个重复的字段。每个主管也是用户吗?
  • 主管是否属于与其用户记录关联的部门?或者主管是否分配到其直接下属所在的部门?
  • 每个主管也是用户。 SupervisorTable.employeeid 与 User.userid 的编号相同(autoinc、bigint、primary)
  • 好的。那么 SupervisorTable.supervisorname 呢?和 userFullName 一样吗?

标签: mysql sql join


【解决方案1】:

如果您想要一个查找所有主管并在您的 OP 中列出所需输出的查询,则可以这样做:

SELECT S.supervisorname,
       D.divisionname
  FROM SuperisorTable S
  JOIN User U ON S.employeeid= U.supervisorid
  JOIN DivisionTable D ON U.divisionid = D.divisionid

因为没有标准,您得到的是笛卡尔积(这很糟糕,除非您真的想要那样)。

【讨论】:

  • 它怎么给我一个空集?
【解决方案2】:

如果我正确理解了您的数据结构:

SELECT 
  S.supervisorname,        
  D.divisionname 
FROM SuperisorTable S  
INNER JOIN Users U ON S.employeeid = U.userid  
INNER JOIN DivisionTable D ON U.divisionid = D.divisionid 

【讨论】:

    【解决方案3】:
    SELECT s.supervisorname, d.divisionname
    FROM DivisionTable d, SupervisorTable s, User u
    WHERE d.divisionid =  u.divisionid
    AND s.supervisorid = u.supervisorid
    AND s.employeeid = u.userid
    

    【讨论】:

    • 当我运行它时,我得到了空集。我有两个主管和三个员工(每个主管也是员工)。 s.employeeid 与 u.userid 相同(我修改了上面的查询以匹配列名)
    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2011-10-31
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多