From df6a8b6fb630a7065c0066a3dae288ff23ddddf4 Mon Sep 17 00:00:00 2001 From: Senorgeno Date: Thu, 17 Jul 2014 13:27:28 +1200 Subject: [PATCH] BUG #3282: Added ability to subselect with in left or inner join --- model/SQLQuery.php | 6 ++++-- tests/model/SQLQueryTest.php | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/model/SQLQuery.php b/model/SQLQuery.php index 79ddb574e..c4a12cad1 100644 --- a/model/SQLQuery.php +++ b/model/SQLQuery.php @@ -903,9 +903,11 @@ class SQLQuery { else if(sizeof($join['filter']) == 1) $filter = $join['filter'][0]; else $filter = "(" . implode(") AND (", $join['filter']) . ")"; + $table = strpos(strtoupper($join['table']), 'SELECT') ? $join['table'] : "\"" + . $join['table'] . "\""; $aliasClause = ($alias != $join['table']) ? " AS \"" . Convert::raw2sql($alias) . "\"" : ""; - $this->from[$alias] = strtoupper($join['type']) . " JOIN \"" - . $join['table'] . "\"$aliasClause ON $filter"; + $this->from[$alias] = strtoupper($join['type']) . " JOIN " + . $table . "$aliasClause ON $filter"; } } diff --git a/tests/model/SQLQueryTest.php b/tests/model/SQLQueryTest.php index e5f5470c3..645d52cf3 100755 --- a/tests/model/SQLQueryTest.php +++ b/tests/model/SQLQueryTest.php @@ -342,6 +342,27 @@ class SQLQueryTest extends SapphireTest { ); } + public function testJoinSubSelect() { + + $query = new SQLQuery(); + $query->setFrom('MyTable'); + $query->addInnerJoin('(SELECT * FROM MyOtherTable)', + 'Mot.MyTableID = MyTable.ID', 'Mot'); + $query->addLeftJoin('(SELECT MyLastTable.MyOtherTableID, COUNT(1) as MyLastTableCount FROM MyLastTable ' + . 'GROUP BY MyOtherTableID)', + 'Mlt.MyOtherTableID = Mot.ID', 'Mlt'); + $query->setOrderBy('COALESCE(Mlt.MyLastTableCount, 0) DESC'); + + $this->assertEquals('SELECT *, COALESCE(Mlt.MyLastTableCount, 0) AS "_SortColumn0" FROM MyTable '. + 'INNER JOIN (SELECT * FROM MyOtherTable) AS "Mot" ON Mot.MyTableID = MyTable.ID ' . + 'LEFT JOIN (SELECT MyLastTable.MyOtherTableID, COUNT(1) as MyLastTableCount FROM MyLastTable ' + . 'GROUP BY MyOtherTableID) AS "Mlt" ON Mlt.MyOtherTableID = Mot.ID ' . + 'ORDER BY "_SortColumn0" DESC', + $query->sql() + ); + + } + public function testSetWhereAny() { $query = new SQLQuery(); $query->setFrom('MyTable');