-1

我想知道一个人的最大阵型,一个人可以有很多阵法条目。

t_formation

idFormation | fkPerson   | fkLevel     | place
------------------------------------------------
    1       |     1      |     2       | Oxford
    2       |     2      |     1       | PlaySchool
    3       |     1      |     3       | Trinity High
    4       |     1      |     1       | My School
    5       |     2      |     3       | My High

a_level

idLevel | orderLevel | formation
-------------------------------------
  1     |   1        |  School
  2     |   3        |  University
  3     |   2        |  High school

我需要得到的是以下查询或所需的查询结果(每个人形成的最大订单级别以及他们研究该最大形成的地方

fkPerson | maxOrderLevel |  formation    |  place
----------------------------------------------------
      1  |      2        |   Univertity  |  Oxford
      2  |      3        |   High school |  My High

为此,我使用 2 个子查询进行了查询,但无法创建有效的视图。

无地点查询SQL,得到每个人的最大编队

select fkPerson, a_level.orderLevel, a_level.formation
from (
  select fkPerson,  max(a_level.orderlevel) as ordermax
  from t_formation left join a_level on t_formation.fkLevel = a_level.idLevel 
  group by fkPerson
) as form left join a_level on form.ordermax = a_level.orderlevel
4

2 回答 2

2

部分问题是您可以orderLevel为每个人设置多个值,fkPerson因此您必须检索max(orderLevel)每个人的值fkPerson,然后执行另一个联接以获取与每个人相关联的place/ 。formation

我看到了几种可以得到结果的方法。

您可以使用子查询来获取max(orderLevel)然后加入您的表以返回所需的列:

select t1.fkPerson, 
  at.MaxOrder,
  t1.Place,
  a.Formation
from t_formation t1
inner join a_level a
  on t1.fkLevel = a.idLevel
inner join
(
  select t.fkPerson, max(a.orderLevel) MaxOrder
  from t_formation t
  left join a_level a
    on t.fkLevel  = a.idLevel
  group by t.fkPerson
) at
  on t1.fkPerson = at.fkPerson
  and at.maxorder = a.orderLevel;

请参阅SQL Fiddle with Demo

您可以获得结果的另一种方法是在您的WHERE子句中使用查询来过滤不具有的行max(orderLevel)

select t.fkperson,
  a.orderlevel,
  t.place,
  a.formation
from t_formation t
left join a_level a
  on t.fkLevel = a.idLevel
where a.orderlevel = (select max(orderlevel)
                      from a_level a
                      inner join t_formation t1
                        on a.idlevel = t1.fklevel
                      where t.fkperson = t1.fkperson
                      group by t1.fkperson);

请参阅SQL Fiddle with Demo

作为旁注,您的示例数据似乎无法给出您要求的结果。最大值orderLevelfkPerson = 23 而不是 2,因此编队University不会High School

于 2013-04-27T23:04:07.440 回答
0

为什么不使用

SELECT fkPerson, fkLevel,orderLevel, formation, place
FROM t_formation as a 
LEFT OUTER JOIN a_level as b ON a.fkLevel = b.idLevel
GROUP BY fkPerson HAVING orderLevel = max(orderLevel)
;

?

于 2013-04-27T15:48:47.887 回答