Aymeric Laporte and Sergio Aguero struck as Manchester City twice came from behind to qualify for the Champions League last 16 with a 2-2 draw at Lyon.
The outstanding Maxwel Cornet grabbed both goals for the hosts, who outplayed the Premier League champions for large spells at the Groupama Stadium.
The Ivory Coast forward opened the scoring in the 55th minute and restored the lead after Laporte's first equaliser, but Aguero had the final word.
The result was enough to ensure City will play in the knockout stages, but they will have to wait until the visit of Hoffenheim next month to try to secure top spot in Group F.
Shakhtar Donetsk snatched a last-gasp 3-2 win at Hoffenheim thanks to Taison's stoppage-time goal to keep their hopes of a top-two finish in Group F alive and send the Germans out of the competition.
Hoffenheim, who needed a win to have any hope of reaching the last 16, were stunned by a double strike early in the first half from the visitors.
Ismaily put Shakhtar ahead in the 14th minute and Taison, who had set up the first, doubled it with a fine finish.
The Germans struck back almost instantly with Andrej Kramaric cutting the deficit and then Steven Zuber levelled it up five minutes before the interval.
Swiss international Zuber then hit the woodwork in the 71st minute with the keeper beaten, but instead it was Taison who snatched a dramatic late winner to lift Shakhtar into third place on five points.
Bayern Munich's Arjen Robben and Robert Lewandowski scored two goals each as the German champions demolished Benfica 5-1 to reach the last 16 and lift some of the pressure off boss Niko Kovac.
Kovac is likely to cling on to his job for at least a few more days after Bayern secured victory with their best performance so far this season.
The embattled coach's future has been in doubt for some time with Bayern sitting in fifth place in the Bundesliga, but Robben's double strike in the first half quickly lifted the gloom at the Allianz Arena on Tuesday.
Ajax reached the Champions League knockout stages for the first time since 2005-06 after a Dusan Tadic brace gave the Dutch side a 2-0 win at 10-man AEK Athens in a match marred by crowd trouble at the Olympic Stadium.
The result left former European Cup winners Ajax second in Group E with 11 points from five games, two behind Bayern.
AEK, who had Marko Livaja sent off in the second half, are bottom without a point and have been eliminated from European competition after suffering a fifth straight defeat.
Riot police clashed with Ajax fans in the stadium before the match and some supporters had blood pouring down their faces.
Juventus booked their place in the next round after a Mario Mandzukic goal was enough to beat Valencia 1-0 in Turin.
In a tense game with few chances and eight yellow cards, Juventus came through on top to retain first place in Group H ahead of Manchester United and ended Valencia's hopes of qualification.
Mandzukic was set up by Cristiano Ronaldo, who beat a defender before delivering a cross for the Croatian striker to score the game's only goal.
Real Madrid found solace in the Champions League once more as a 2-0 win at Roma confirmed top spot in Group G.
The three-time reigning champions took a 47th-minute lead through Gareth Bale, who capitalised on Federico Fazio's mistake.
That came after Cengiz Under's woeful miss at the end of the first half and Real doubled their lead when Lucas Vazquez struck to secure top spot in the pool.
Both sides are suffering domestically. Roma lost to Udinese in Serie A last Saturday and are seventh; Real are sixth in LaLiga following a 3-0 loss to Eibar, their fifth of the season.
But both are in the knockout stages of Europe's elite club competition. Viktoria Plzen's earlier 2-1 win at CSKA Moscow meant both sides were through before kick-off, with top spot in Group G and a favourable last-16 seeding becoming the target.