gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 21:34:54 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com