MIAMI — Tom Koehler focused on the opposing hitters, rather than the other team's pitcher. No matter that it was NL All-Star starter Matt Harvey.

Koehler threw six effective innings and the Miami Marlins stalled Harvey once again, beating the New York Mets 3-0 Thursday.

"The key is really not to think about it too much," Koehler said. "I was facing the Mets. You put up zeros against anybody who's pitching, your team tends to be in pretty good shape."

Logan Morrison's two-out single broke a scoreless tie in the sixth. Donovan Solano added a two-run single later in the inning.

"He's got good stuff. Right now he's one of the best pitchers in baseball and so I think the whole team feels good because he lost today," Solano said.

Harvey (8-3) allowed three runs and five hits in 5 2-3 innings. He struck out eight.

"He deserves a better fate than what he has had," Mets manager Terry Collins said. "He has pitched great. We just don't score many runs."

Harvey's three shortest outings this season have come at Marlins Park. He is 0-1 with a 3.52 ERA in four starts against the Marlins this season while going 8-2 with a 1.97 ERA against the rest of the majors.

"It's not like I take this start or this team any different than against any other team," Harvey said. "It's just been that team this year that happens to squeeze out some runs."

The Marlins are the lowest-scoring team in the majors and have the worst record in the NL.

"I don't know that I can explain it," Marlins manager Mike Redmond said. "For whatever reason we really lock it in against him and we've just been able to kind of rise to the occasion."

Koehler (3-6) gave up five hits, walked five and struck out five.

Reliever A.J. Ramos pitched two innings and Steve Cishek worked the ninth for his 23rd save in 25 chances.

It was the first time the Mets had been shut out since May 25 against Atlanta.

New York went 0 for 7 with runners in scoring position. They left a runner in scoring position in five of the first six innings and stranded 11 overall.

"There's no secret," Collins said. "If we knew what it was, we'd fix it. Guys aren't driving in runs. There's nothing wrong with the approach. We're not getting good swings at the pitches we can hit and we're fouling them off. Therefore we're not driving them in."

Ike Davis popped out with the bases loaded to end the third. Juan Lagares tripled with one out in the fourth, but the Mets could not drive him in, and Jake Marisnick made a diving catch in center field and threw to first to double up David Wright to end the fifth.

"That play Jake made in center field is a game-changer," Koehler said. "That ball falls and get by him we're talking two runs there and another guy in scoring position. That play right there really changed the game."

Meanwhile, the Marlins managed just one hit through five innings, a single by Koehler in the third after Harvey struck out four in a row.

"Things were fine until the sixth inning," Harvey said.

Juan Pierre pinch-hit for Koehler and singled to lead off the sixth, making him 7 for 15 lifetime against Harvey. Christian Yelich followed with a single that put runners at the corners with no outs.

Harvey retired the next two batters, but Morrison singled for a 1-0 lead. After Harvey hit Ed Lucas with a pitch to load the bases, Solano singled to chase Harvey.

Justin Turner and Lagares each had two hits for the Mets.

NOTES: Harvey is 0-1 with a 4.50 ERA in three starts at Marlins Park. ... Since June 16, Miami starting pitchers have allowed three of fewer runs in 35 of 40 games. ... Marlins rookie RHP Jose Fernandez (7-5, 2.71 ERA), who is coming off a 13-strikeout performance against the Pirates, will take the mound on Friday against Cleveland RHP Ubaldo Jimenez (8-5, 4.17) to wrap up the final series in a 10-game homestand. The Mets will host Kansas City and start RHP Dillon Gee (7-8, 4.13) on Friday against RHP Wade Davis (5-9, 5.50).