allow selecting multiple columns with SELECT DISTINCT

Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
Robin Appelman 2020-11-09 17:43:29 +01:00 committed by Joas Schilling
parent 426dc68b45
commit a61a757b85
No known key found for this signature in database
GPG Key ID: 7076EA9751AACDDA
2 changed files with 45 additions and 1 deletions

View File

@ -436,8 +436,14 @@ class QueryBuilder implements IQueryBuilder {
* @return $this This QueryBuilder instance. * @return $this This QueryBuilder instance.
*/ */
public function selectDistinct($select) { public function selectDistinct($select) {
if (!is_array($select)) {
$select = [$select];
}
$quotedSelect = $this->helper->quoteColumnNames($select);
$this->queryBuilder->addSelect( $this->queryBuilder->addSelect(
'DISTINCT ' . $this->helper->quoteColumnName($select) 'DISTINCT ' . implode(', ', $quotedSelect)
); );
return $this; return $this;

View File

@ -314,6 +314,44 @@ class QueryBuilderTest extends \Test\TestCase {
$this->deleteTestingRows('testFirstResult2'); $this->deleteTestingRows('testFirstResult2');
} }
public function testSelectDistinctMultiple() {
$this->deleteTestingRows('testFirstResult1');
$this->deleteTestingRows('testFirstResult2');
$this->createTestingRows('testFirstResult1');
$this->createTestingRows('testFirstResult2');
$this->queryBuilder->selectDistinct(['appid', 'configkey']);
$this->queryBuilder->from('*PREFIX*appconfig')
->where($this->queryBuilder->expr()->eq(
'appid',
$this->queryBuilder->expr()->literal('testFirstResult1')
))
->orderBy('appid', 'DESC');
$query = $this->queryBuilder->execute();
$rows = $query->fetchAll();
$query->closeCursor();
$this->assertEquals(
[
['appid' => 'testFirstResult1', 'configkey' => 'testing1'],
['appid' => 'testFirstResult1', 'configkey' => 'testing2'],
['appid' => 'testFirstResult1', 'configkey' => 'testing3'],
['appid' => 'testFirstResult1', 'configkey' => 'testing4'],
['appid' => 'testFirstResult1', 'configkey' => 'testing5'],
['appid' => 'testFirstResult1', 'configkey' => 'testing6'],
['appid' => 'testFirstResult1', 'configkey' => 'testing7'],
['appid' => 'testFirstResult1', 'configkey' => 'testing8'],
['appid' => 'testFirstResult1', 'configkey' => 'testing9'],
],
$rows
);
$this->deleteTestingRows('testFirstResult1');
$this->deleteTestingRows('testFirstResult2');
}
public function dataAddSelect() { public function dataAddSelect() {
$config = $this->createMock(SystemConfig::class); $config = $this->createMock(SystemConfig::class);
$logger = $this->createMock(ILogger::class); $logger = $this->createMock(ILogger::class);