mysql - 查找最后一个服务ID

时间:2015-12-19 02:15:50

标签: mysql

我有一个包含4个表的数据库:公司,tmid,服务,提供商。
下图是记录:
enter image description here

我的要求如下:
(1)最后的服务ID
(2)pID = 2
(3)默认= Y

我尝试了以下查询,无法获得预期的输出:

(1)
select c.cID, max(s.svcID) as svcID, s.svcNote, s.svcStatus, tm.idm, tm.idt, p.pName
from service s
left join tmid tm on s.sNo = tm.sNo
left join provider p on tm.pID = p.pID
left join company c on s.cID = c.cID
where tm.default = 'Y' && tm.pID = 2
group by c.cID
order by c.cJoinDate desc

(2)
select c.cID, max(s.svcID) as svcID, s.svcNote, s.svcStatus, tm.idm, tm.idt, p.pName
from service s
left join tmid tm on s.sNo = tm.sNo
left join provider p on tm.pID = p.pID
left join company c on s.cID = c.cID
where tm.default = 'Y' && tm.pID = 2
group by c.cID, s.svcID
order by c.cJoinDate desc

我的预期输出如下图所示:
enter image description here

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

我相信你需要这样的查询:

select s.svcid, s.svcstatus, svcnote, t.idm, t.idt, p.pname
from service s
inner join tmid t on s.sno = t.sno and 'Y' = t.dft
inner join provider p on t.pid = p.pid
where s.pid = 2

union all

select s.svcid, s.svcstatus, svcnote, t.idm, t.idt, p.pname
from service s
inner join tmid t on s.sno = t.sno and 'Y' = t.dft
inner join provider p on t.pid = p.pid
where s.svcid = (select max(svcid) from service);

示例:http://sqlfiddle.com/#!9/8ef422/1

创建声明:

create table service (
  svcID int,
  svcStatus varchar(20),
  sNo int,
  cID int,
  svcNote varchar(20),
  pID int
);
insert into service values
(1, 'CLOSED', 111111, 1, 'service note 1', null),
(2, 'OPEN', 111111, 1, 'service note 2', 2),
(3, 'CLOSED', 111112, 2, 'service note 3', null),
(4, 'OPEN', 111112, 2, 'service note 4', 2),
(5, 'CLOSED', 111113, 3, 'service note 5', null);

create table tmid (
  ID int,
  sNo int,
  idm varchar(20),
  idt varchar(20),
  pID int,
  dft char(10)
);
insert into tmid values
(1, 111111, 'test00001', 'test00001', 1, 'N'),
(2, 111111, 'test00002', 'test00002', 2, 'Y'),
(3, 111111, 'test00003', 'test00003', 1, 'N'),
(4, 111112, 'test00004', 'test00004', 2, 'Y'),
(5, 111112, 'test00005', 'test00005', 3, 'N'),
(6, 111113, 'test00006', 'test00006', 2, 'Y'),
(7, 111113, 'test00007', 'test00007', 1, 'N');

create table provider (pid int, pname varchar(20));
insert into provider values (1, 'Maybank'), (2, 'Public Bank'), (3, 'CIMB Bank');

结果:

| svcid | svcstatus |        svcnote |       idm |       idt |       pname |
|-------|-----------|----------------|-----------|-----------|-------------|
|     2 |      OPEN | service note 2 | test00002 | test00002 | Public Bank |
|     4 |      OPEN | service note 4 | test00004 | test00004 | Public Bank |
|     5 |    CLOSED | service note 5 | test00006 | test00006 | Public Bank |

编辑:

根据您更新的查询并更好地了解您的需求,您可以编写如下查询:

select s.svcid, s.svcstatus, s.svcnote, t.idm, t.idt, p.pname
from tmid t
inner join provider p on t.pid = p.pid
inner join (select sno, max(svcid) maxsvcid from service group by sno) x
  on t.sno = x.sno
inner join service s on x.sno = s.sno and x.maxsvcid = s.svcid
where t.dft = 'Y' and t.pid = 2

示例:http://sqlfiddle.com/#!9/bd2a13/5

结果:

| svcID | svcStatus |        svcNote |       idm |       idt |       pname |
|-------|-----------|----------------|-----------|-----------|-------------|
|     2 |      OPEN | service note 2 | test00002 | test00002 | Public Bank |
|     4 |      OPEN | service note 4 | test00004 | test00004 | Public Bank |
|     5 |    CLOSED | service note 5 | test00006 | test00006 | Public Bank |