我有一个 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/