MySQL多表连接和总数

时间:2017-05-16 19:41:18

标签: mysql sql

[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表格,查看Personfirst_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

1 个答案:

答案 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