Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询只处理一列,并在添加第二列后立即停止工作_Sql_Group By_Inner Join_Greatest N Per Group - Fatal编程技术网

SQL查询只处理一列,并在添加第二列后立即停止工作

SQL查询只处理一列,并在添加第二列后立即停止工作,sql,group-by,inner-join,greatest-n-per-group,Sql,Group By,Inner Join,Greatest N Per Group,我一直在尝试让这个查询工作,但我还没有做到这一点,以下是我迄今为止所做的工作: select c.EID from certified c inner join aircrafts a ON c.AID = a.AID group by c.EID HAVING count(c.EID) >= 3 and MAX(a.CRUISINGRANGE); 结果: EID '141582651' '142519864' '269734834' '390487451' '552

我一直在尝试让这个查询工作,但我还没有做到这一点,以下是我迄今为止所做的工作:

select c.EID
from certified c
    inner join aircrafts a ON c.AID = a.AID
group by c.EID 
HAVING count(c.EID)  >= 3 and MAX(a.CRUISINGRANGE);
结果:

EID
'141582651'

'142519864'

'269734834'

'390487451'

'552455318'

'556784565'

'567354612'

'573284895'
正如你所看到的,我有一个与飞机表的内部连接,以获得最大巡航范围,从认证中我计算并返回可以驾驶3架以上飞机的飞行员

现在我的问题是,我似乎无法在我的选择中添加a.AID以显示它,以下是我尝试的内容:

select c.EID, a.AID
from certified c
    inner join aircrafts a ON c.AID = a.AID
group by c.EID, a.AID
HAVING count(c.EID)  >= 3 and MAX(a.CRUISINGRANGE);
结果:

EID
'141582651'

'142519864'

'269734834'

'390487451'

'552455318'

'556784565'

'567354612'

'573284895'
开斋节援助

0行

预期结果:

EID          AID

'141582651'  '6475'

'142519864'  '8430'

'269734834'   '8430'

'390487451'   '7120'

'552455318'   '3383'

'556784565'   '7120'

'567354612'   '8430'

'573284895'   '7120'
但我在尝试这样做时得到了0行

DATA SAMPLE: 
Certified: 
EID        AID
142519864   1
269734834   1
550156548   1
567354612   1
11564812    2
141582651   2
142519864   2
242518965   2
269734834   2
552455318   2
556784565   2


AIRCRAFTS
AID    ANAME         CRUISING RANGE
1   Boeing 747-400  8430
2   Boeing 737-800  3383
3   Airbus A340-300 7120
4   British Aerospace Jetstream 41  1502
5   Embraer ERJ-145 1530
6   SAAB 340    2128
7   Piper Archer III    520
8   Tupolev 154 4103
9   Lockheed L1011  6900
10  Boeing 757-300  4010
11  Boeing 777-300  6441
12  Boeing 767-400ER    6475
13  Airbus A320 2605
14  Airbus A319 1805
15  Boeing 727  1504
16  Schwitzer 2-33  30
123 Airbus  1000
302 Boeing  5000
306 Jet01   5000
378 Airbus380   8000

你的问题真的很难理解;你似乎没有以连贯一致的方式表达你想要的东西。通过阅读评论,您似乎想知道:

每个飞行员(3架或3架以上飞机)可飞行的最远距离

因此,您需要飞行员EID列表,以及飞行员可能驾驶的所有飞机的最大巡航距离(从飞机表中)。飞行员必须能驾驶至少3架飞机

步骤:

建立飞行员名单以及他们被评定的飞机可以飞行的距离:

SELECT c.EID, a.cruising_range
FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
改进查询以计算每个飞行员的等级和最大巡航距离(飞行员可以驾驶飞机,飞机有航程,因此当飞行员驾驶飞机时,飞行员有航程):

改进查询,仅选择至少能驾驶3架飞机的飞行员:

SELECT c.EID, max_range FROM
(
  SELECT c.EID, COUNT(*) as count_ratings, MAX(a.cruising_range) max_range
  FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
  GROUP BY c.EID --per pilot
) pilot_ranges
WHERE
  pilot_ranges.count_ratings >= 3
我本来可以:

SELECT c.EID, MAX(a.cruising_range) max_range
FROM certified c INNER JOIN aircrafts a ON c.AID = a.AID
GROUP BY c.EID 
HAVING COUNT(*) >= 3
但有时,将查询可视化地安排在一组步骤中,而不是试图一次完成所有操作,并使用子查询在心里形成一个数据列表,然后对其进行更改、过滤和添加,这会带来好处。。都是分阶段的

查询优化器可能会在内部重写这些查询,以便它们最终以相同的方式执行,这样做的好处是有助于人类理解和将来的维护

编辑:这里有一个查询,列出了每个飞行员-飞机组合的EID和AID,其中飞行员能够驾驶3架以上的飞机:

SELECT c.EID, a.AID FROM
(
  SELECT c.EID
  FROM certified c
  GROUP BY c.EID 
  HAVING count(*) >= 3
) find_pilots_can_fly_atleast_three
INNER JOIN certified c ON c.EID = find_pilots_can_fly_atleast_three.EID
INNER JOIN aircrafts a ON c.AID = a.AID
首先,您生成一个有趣的飞行员列表-这是子查询
查找飞行员\u至少可以飞行\u三架
,然后我们将该数据连接回认证飞机和飞机。我们最终得到了一份能驾驶3架飞机的飞行员名单,我们得到了飞机的详细信息

你可能一次尝试做的太多了。分组时,会丢失某些数据位。为了找到能够驾驶3架以上飞机的飞行员,我们必须丢失飞机ID,并且只保留飞行员ID。如果您尝试保留飞机ID(因为您需要),您最终得到的组数只有1,因为每个飞行员-飞机组合都是唯一的。因此,我们将飞机id丢失到聚合(计数)中,并保留飞行员id。这有助于我们了解每个飞行员可以飞多少架飞机。 为了找出这些飞行员可以驾驶哪些飞机,我们必须将“find 3+”查询中的飞行员id连接回飞行员飞机列表(认证表),将其扩展回有飞机的飞行员列表


请始终记住,您可以将一个表连接到它本身,在这种情况下,这一点非常重要。如果你有一个满是地址的表格,上面写着你住在那个地址的日期,要找到最新的地址,你需要一个查询,其中包含
your\u id,max(lived_there_to_date
但您不能保留任何其他地址数据-您需要最新记录的日期..然后如果您确实需要来自最新行的其余数据,您可以将刚才执行的查询加入addresses表,以检索包含最新lived_there_to date的整行数据

用数据标记您的问题如果您正在使用。另外,请解释您正在尝试执行的操作。示例数据和所需结果会有所帮助。您可能会感到惊讶,但不起作用的查询不一定是传达意图的好方法。您有一个不完整的条件,即拥有
和MAX(a.CRUISINGRANGE)
…应该是
和MAX(a.CRUISINGRANGE)>10
添加适当的数据样本和预期结果以及预期结果result@Coldhands…这可能是您希望代码执行的操作。但SQL不是这样工作的。示例数据、所需结果和对所需内容的解释确实会有帮助。虽然我只需要在您的第三次也是最后一次查询中选择EID和AID,但有吗一种不选择max(a.cruising_range)而将其放在where?或groupby/have?中的方法实际上,我们的数据库设置为“set session sql_mode=‘ONLY_FULL_group_by’;”我需要找到的是:SELECT c.EID,a.AID尽管我不能使用这个SELECT,因为我们的数据库要求我们按整个SELECT组分组…无论如何,为了避开它?我很困惑。你看到我在哪里做了一个
SELECT EID,AID
?世界上的每个数据库都要求你分组或聚合列。你现在是说u want是一个飞行员和飞机的列表,每个飞行员和他们能飞的每架飞机(但也许你只想要至少能飞3架飞机的飞行员)?为什么你想把最大航程放在where/have中?你一开始肯定没有说巡航航程是飞行员被列入名单的一个因素?!我真的很抱歉弄糊涂了,但这确实是我想要的,而且我似乎无法设法汇总选择。