CHICAGO -- Yadier Molina hit a bases-loaded triple off David Robertson with two out in the eighth inning, sending the St. Louis Cardinals to a 3-2 victory over the Chicago White Sox on Wednesday night.
Randal Grichuk singled, Matt Holliday was hit by a pitch and Jason Heyward reached on catcher's interference before Molina drove a 2-2 pitch into the corner in right for his third hit of the game.
It was the first triple for the All-Star catcher since May 22, 2011, and No. 4 for his career.
Miguel Socolovich (4-1) pitched a scoreless seventh for the win.
Kevin Siegrist struck out Adam LaRoche with runners on the corners for the final out in the eighth, and Trevor Rosenthal finished for his 29th save in 31 chances.
St. Louis (60-34) has won four of five heading into a season-long 11-game homestand beginning on Thursday night against Kansas City.
It was another heartbreaking loss for the last-place White Sox (42-50), who have dropped four straight and six of seven. Zach Duke (3-4) got two outs in the eighth before he was replaced by Robertson, and Tyler Flowers struck out three times in addition to his costly miscue behind the plate that put Heyward on in the eighth.
John Danks pitched 6 2/3 innings of five-hit ball for Chicago, extending his scoreless streak to 12 2/3 innings over his last two starts. The left-hander struck out five and walked none.
Danks and Lance Lynn were locked up in a scoreless duel before Chicago pushed across two runs in the sixth, helped by a miscue for Cardinals shortstop Jhonny Peralta. With runners on first and second and no outs, Peralta juggled Tyler Saladino's potential double-play grounder as he tried to get the ball out of his glove, leaving no chance for second baseman Kolten Wong to get the speedy rookie at first.
Jose Abreu and Melky Cabrera followed with consecutive RBI singles, lifting the White Sox to a 2-0 lead. Lynn then struck out Avisail Garcia and retired LaRoche on a fly ball to the warning track in center.
Lynn retired his first eight batters, but consecutive hits for Carlos Sanchez and Adam Eaton put runners on second and third with two out in the third. Saladino then looked at a called third strike, ending the inning.
The Cardinals had the same opportunity in the fifth, putting runners on second and third with two down, but Danks retired Wong on a fly ball to center for the final out.
LaRoche went 0 for 4 and is batting .148 (8 for 54) with no homers and two RBIs in July.
"It's confusing, frustrating," LaRoche said before the game. "I'll go and figure it out for an at-bat or two, and then it's gone, where in the past I've been able to figure it out and maybe hold onto it for a while."
Cardinals: Holliday was the designated hitter for the second straight day. The All-Star was activated from the disabled list on Friday after being sidelined by a strained right quadriceps, but he hasn't been cleared to run full speed yet. "I think it's getting closer and better every day," manager Mike Matheny said. "A couple of days here as a DH have certainly been helpful. We'll see when we get back home tomorrow. We'll see what the doctors are saying." ... RHP Mitch Harris (right groin strain) pitched a scoreless inning in a rehab appearance for Triple-A Memphis on Tuesday.
Cardinals: RHP John Lackey (8-5, 2.90 ERA) gets the ball when St. Louis begins an 11-game homestand Thursday night against Kansas City in the makeup of a June 14 rainout. RHP Chris Young (8-5, 3.03 ERA) starts for the Royals in a matchup of the teams with the best record in each league.
White Sox: RHP Jeff Samardzija (6-5, 4.08 ERA) makes what could be his final start for Chicago when the White Sox open a four-game series at Cleveland on Thursday night. Samardzija is a possible trade target ahead of the July 31 non-waiver deadline. RHP Trevor Bauer (8-6, 4.03 ERA) pitches for the Indians.