[JsonProperty]
详细信息:
动物表将拥有属于一个群体的动物 动物中的每只动物可以在位置表中具有多个位置 对于位置表中的每只动物,可以有person_id或organization_id。
我需要获取该ID并查看人员或组织表中的详细信息。
对于位置表中的每只动物,他们可能需要培训成本和供应成本,我需要获得总数
我现在所做的是,从动物表中获取所有动物:
Table Animal:
id, group_id and name
Table Location:
id, group_id,animal, supplies, training, person_id,organization_id,date
Table Person
id, firstname, lastname
Table orgnization
id, org_name
这将为我提供一组动物名单
select * from animal where group_id=70
这将给出一组5或6个条目,并在代码中循环通过每只动物获得总供应量,以及每只动物的总培训成本
select * from location where group_id=70 and animal_id = 60905442.
这是为了获取动物的最新位置,因为动物可能位于多个地方。
目标是找到动物的最新位置。这将为该动物提供select * from location where animal_id = ? and group_id = ? order by date
或person_id
然后如果上述查询有organizagoin_id
,请查看person_id
表格,查看Person
和first_name
否则会在last_name
表中查看organization
。
我知道这可以在一个查询中完成,但需要一些帮助。
样本表数据:
org_name
组织表 id organization_name 80 Microsoft LLC 85 Apple LLC
期望的输出: animal_id group_id name totalsupplies totaltraining personfirstname personlastname orgname
答案 0 :(得分:0)
我找到了您的问题的查询,但这是t-sql语法。我希望在查看查询是如何构建时,这可以帮助您进一步。我猜这个row_number函数在MySQL中不可用。
declare @animal table (id int, group_id varchar(50), name varchar(50))
insert into @animal values
(6923,'A','harry'),
(6924,'A','larry'),
(6925,'A','Marry'),
(6888,'B','Eddy')
declare @location table (id int, group_id varchar(50), animal_id int, supplies int, training int, person_id int, org_id int, loc_date date)
insert into @location values
(1,'A',6923,10,null,90,0,'20170510'),
(2,'A',6923,10,10,90,0,'20170517'),
(3,'A',6924,0,10,0,80,'20170512'),
(4,'A',6924,10,10,0,85,'20170515'),
(5,'A',6925,0,0,95,0,'20170513'),
(6,'B',6888,20,20,95,0,'20170514')
declare @person table (id int, firstname varchar(50), lastname varchar(50))
insert into @person values
(90,'Test','Tester'),
(95,'Sam','Tester')
declare @organization table (id int, name varchar(50))
insert into @organization values
(80, 'Microsoft'),
(85, 'Apple')
select a.id, a.group_id, a.name, ttl.totalsupplies, ttl.totaltraining,
case when lastloc.person_id <> 0 then p.firstname + ' ' + p.lastname else '' end as person,
case when lastloc.org_id <> 0 then o.name else '' end as organization
from
(select m.id, m.group_id, m.animal_id, m.supplies, m.training, m.person_id, m.org_id, m.loc_date
from
(select id, group_id, animal_id, supplies, training, person_id, org_id, loc_date,
ROW_NUMBER() over(partition by animal_id order by loc_date desc) AS r
from @location) AS m
where m.r = 1) AS lastloc
inner join
(select animal_id, sum(supplies) as totalsupplies, sum(training) as totaltraining
from @location
group by animal_id) AS ttl
on ttl.animal_id = lastloc.animal_id
inner join
@animal as a on a.id = lastloc.animal_id
left outer join
@person as p on p.id = lastloc.person_id
left outer join
@organization as o on o.id = lastloc.org_id
这将导致
id group_id name totalsupplies totaltraining person organization
----------------------------------------------------------------------------------
6923 A harry 20 10 Test Tester
6924 A larry 10 20 Apple
6925 A Marry 0 0 Sam Tester
6888 B Eddy 20 20 Sam Tester