mysql - 查询从一个表和一个额外的列检索信息,这是另一个表的条件

标签 mysql sql count case

我有一个 worker 表和一个关联的卡表:

CREATE TABLE IF NOT EXISTS `workers` (
  `ID` varchar(20) NOT NULL,
  `companyID` int(11) NOT NULL,
  `FName` varchar(25) NOT NULL,
  `Sname` varchar(25) NOT NULL,
  `isAvailable` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `workers`
 ADD PRIMARY KEY (`ID`), ADD KEY `cmp_idx` (`companyID`), ADD KEY `isAvailable_idx` (`isAvailable`);

我需要检索一份 worker 列表,每个 worker 都有一个指示符,表明他们的卡是否尚未获得批准。

卡片表如下:

CREATE TABLE IF NOT EXISTS `cards2` (
`ID` int(11) NOT NULL,
  `Name` varchar(200) NOT NULL,
  `WorkerID` varchar(20) NOT NULL,
  `pic` varchar(200) NOT NULL,
  `expDate` bigint(20) NOT NULL,
  `reminderSent` tinyint(4) NOT NULL,
  `regNum` varchar(8) NOT NULL,
  `cardType` varchar(200) NOT NULL,
  `approvalStatus` tinyint(4) NOT NULL
) ENGINE=MyISAM AUTO_INCREMENT=95 DEFAULT CHARSET=latin1;

ALTER TABLE `cards2`
 ADD PRIMARY KEY (`ID`), ADD KEY `cardsWorkerID_idx` (`WorkerID`);

approvalStatus 可以是 2(尚未确定)、1(已批准)或 2(未批准) 因此,如果所有卡都获得批准,则返回的指示器应仅为绿色(1);如果任何卡尚未获得批准或未批准,则返回的指示器应为红色(0)。

检索 worker 的查询很简单:

SELECT distinct Workers.ID, FName, SName, companyID
FROM Workers WHERE companyID = ? and  
and isAvailable = 1
LIMIT ?, 10

当尝试取回卡片指示符时,我尝试了以下操作:

    SELECT Workers.ID, FName, SName, 
COUNT(CASE WHEN approvalStatus = 0 or approvalStatus = 2 THEN 1 ELSE 0 end) AS cardStatus 
FROM `workers` 
inner join cards2 ON Workers.ID = Cards2.WorkerID 
WHERE workers.companyID = 1

这只会返回一名 worker

更新 如果用户没有关联的卡,它还应该标记为红色状态

最佳答案

您可以使用EXISTS询问用户是否存在开放或未批准的卡:

select id, fname, sname, companyid,
  case when exists 
  (
    select * 
    from cards2 c
    where c.workerid = w.id
    and c.approvalstatus in (0,2)
  ) then then 'red' else 'green' end as status
from workers w 
where companyid = ?
and isavailable = 1;

更新:以下是对没有卡片 = 红色的附加要求的查询:

select id, fname, sname, companyid,
  case when exists 
  (
    select * 
    from cards2 c
    where c.workerid = w.id
    and c.approvalstatus in (0,2)
  )
  or not exists 
  (
    select * 
    from cards2 c
    where c.workerid = w.id
  ) then then 'red' else 'green' end as status
from workers w 
where companyid = ?
and isavailable = 1;

这里与使用 MySQL 三 bool 逻辑聚合的状态相同:

select w.id, w.fname, w.sname, w.companyid,
  case when not c.bad then 'green' else 'red' end as status
from 
(
  select 
    workerid,
    max(case when approvalstatus in (0,2) then 1 else 0 end) as bad
  from cards2
  group by workerid
) c
from workers w 
where w.companyid = ? and  
and w.isavailable = 1;

关于mysql - 查询从一个表和一个额外的列检索信息,这是另一个表的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997452/

相关文章:

php - MYSQL基于CASE查询多个字段

php - 如何使用 LIKE 运算符搜索一个月中的日期?

sql - 仅当字符串长度大于 2 时才选择列

php - mysql查询2个表并计数

excel - 仅计算包含文本/数据的字段,而不计算公式

c++ - SQLite如何限制记录数

mysql - 将日期插入 MySQL

php - 从表中获取 2 列到 assoc 数组 php

sql - Postgres on AWS 过滤器或聚合的性能问题

mysql - MVCC 行锁定与教科书事务行为