0

我在 MySQL 数据库中有一个目录表,其中包含用户 ID、用户类型和各种其他目录信息。有两种类型的用户:employeestudent。主键是(userID, userType),因此任何给定的用户都可以拥有一条employee记录和一条student记录(如果他们既是员工又是学生)。

我想对该表的一个子集执行查询,以便:

  • 如果用户只有一个employeexorstudent记录,则使用该记录,并且
  • 如果用户同时拥有 anemployee和一条student记录,employee则使用该student记录并忽略该记录

我不需要ORDER BY在查询中包含子句,但它们可以包含相当复杂的WHERE子句(包括对userType自身的查询)。

理想情况下,我希望这样做而不必创建额外的表或视图,但如果需要额外的视图,我可以向系统管理员询问CREATE VIEW权限。

4

3 回答 3

2

接下来我会做,如果我需要最少的 DDL -

Select * From YourTable where UserType='Employee'
Union 
Select * from YourTable s where s.UserType='Student' and s.UserId not in (Select UserId from YourTable where UserType='Employee')

首先将挑选员工,其次 - 仅限学生。没有测试,但它应该适用于 t-sql。

如果你不喜欢“不在”

Select * From YourTable where UserType='Employee'
Union 
Select distinct s.* from YourTable s
   left join YourTable e on s.UserId=e.UserId and s.UserType = 'Student' and e.UserType='Employee'
Where e.UserId is null
于 2012-05-14T18:50:17.810 回答
1

我建议您有一个表,其中每个用户有一个具有适当用户类型的行。在这种情况下,您可以简单地取 min(userType),因为当两者都存在时它会选择员工。

然后,您可以在查询中使用它。这是一个例子:

select table.*
from table join
     (select userid, min(usertype) as usertype
      from table
      group by userid
     ) users
     on table.userid = users.userid and
        table.usertype = users.usertype
于 2012-05-14T18:49:48.967 回答
0

并没有实际测试它,但这样的事情应该可以工作:

SELECT *
FROM directory
WHERE
    userType = 'employee'
    OR userID NOT IN (
        SELECT userID
        FROM directory
        WHERE userType = 'employee'
    )

用简单的英语:选择所有员工(OR 左侧)和所有没有相应员工的学生(OR 右侧)。

于 2012-05-14T18:57:47.557 回答