AC Milan 1-2 Liverpool
Liverpool became the first English team to win all six matches in the group stages after defeating AC Milan on Tuesday night.
Fikayo Tomori broke the deadlock for the Rossoneri on the half-hour mark but Mohamed Salah replied for the Reds six minutes later.
Divock Origi gave Jurgen Klopp's charges the lead ten minutes inside the second stanza and that proved to be the winner, as Milan were condemned to the bottom of the log.
Real Madrid 2-0 Inter Milan
Real Madrid finished their Group D campaign unbeaten and at the top after beating ten-man Inter Milan 2-0 at Estadio Santiago Bernabeu.
Toni Kroos opened the scoring for Los Blancos in the 17th minute and Inter were dealt a blow after they were reduced to ten men in the 64th minute following the red-card of Nicolo Barella for violent conduct.
Marco Asensio put the game to bed for Madrid 11 minutes before time but Inter also qualified for the round of 16 after finishing second in the group.
FC Porto 1-3 Atletico Madrid
Atletico Madrid qualified for the round of 16 as runners-up in the last match in Group B after a late 3-1 win over direct rivals Porto at Estadio do Dragao.
After a goalless first stanza, Antoine Griezmann eventually broke the deadlock for Atletico 11 minutes inside the second stanza but the Spanish side were reduced to ten men in the 67th minute after Yannick Carrasco was sent off for violent conduct.
However, the sides were evenly matched three minutes later after Wendell was also red-carded for Porto for the same reason.
Angel Correa and Rodrigo De Paul netted two late goals for Atletico to secure a spot in the last 16, directly ahead of Porto, who had to settle for a UEFA Europa League spot.
Borussia Dortmund 5-0 Besiktas
Borussia Dortmund had to settle for a place in the UEFA Europa League despite a 5-0 drubbing of ten-man Besiktas at Signal Iduna Park.
Donyell Malen broke the deadlock for Dortmund on the half-hour mark and Beskitas were reduced to ten men just before the half-time break after Welinton got sent for a professional foul in the box, which allowed Marco Reus to double the lead for the hosts from the resultant penalty.
Reus made it 3-0 for BVB early in the second stanza while Erling Haaland also scored twice late on to make it 5-0, however, Dortmund finished in third place, losing out on a place in the knockout stages to Sporting CP.
Ajax Amsterdam 4-2 Sporting CP
Ajax Amsterdam ended their Group C campaign with a perfect record at the top after hammering Sporting CP 4-2 at Johan Cruijff Arena.
Sebastien Haller got an early lead for Ajax and Nuno Santos levelled matters for Sporting midway through the first stanza.
Antony restored the lead for the hosts just before the half-time break while second-half goals by David Neres and Steven Berghuis made it 4-1.
Bruno Tabata pulled a goal back for Sporting 12 minutes before time but it was too little too late, however, the Portuguese side qualified for knockout stages as runners-up in the group.
Shakhtar Donetsk 1-1 Sheriff Tiraspol
Shakhtar Donetsk finished their campaign in Group D winless and at the bottom after they were held to a last-gasp 1-1 draw by Sheriff Tiraspol at Olimpiyskiy Stadium.
Fernando broke the deadlock for Shakhtar just before the half-time break but Boban Nikolov snatched a stoppage time equaliser for Sheriff, who finished in the UEFA Europa League spot.
Paris Saint-Germain 4-1 Club Brugge
Paris Saint-Germain ended their group stage campaign with a 4-1 thrashing of Club Brugge.
The 2018 World Cup winner had the home side 2-0 up inside seven minutes with two quick-fire goals to put the French outfit in control.
Marcel Rits pulled a goal back for Brugge, but Messi made sure of the win in the 76th minute to bag his fifth goal of the competition.
PSG finish second in Group A despite the big win while Brugge finish rock bottom.
RB Leipzig 2-1 Manchester City
Manchester City ended their group stage campaign on a low after going down 2-1 to RB Leipzig on Tuesday evening.
The Citizens were already assured of top spot heading into the encounter after defeating PSG on matchday five.
Leipzig got the opening goal through Dominik Szoboszlai on 24 minutes before Andre Silva doubled the advantage on 71 minutes.
Riyad Mahrez reduced the deficit on 76 minutes, but Leipzig had done enough to secure a third-place finish and will go into the Europa League.
Here is a look at the 10 costliest squads in Europe!