diff --git a/include/class.search.php b/include/class.search.php
index 6c410dad17bee4a641d2940be0b1d4fa1bdbd8a8..914bb2c1342af38299f653e56270350baecf80ca 100644
--- a/include/class.search.php
+++ b/include/class.search.php
@@ -257,31 +257,36 @@ class MysqlSearchBackend extends SearchBackend {
     function find($query, $criteria=array(), $model=false, $sort=array()) {
         global $thisstaff;
 
-        $tables = array();
         $mode = ' IN BOOLEAN MODE';
         #if (count(explode(' ', $query)) == 1)
         #    $mode = ' WITH QUERY EXPANSION';
-        $where = array('MATCH (search.title, search.content) AGAINST ('
+        $search = 'MATCH (search.title, search.content) AGAINST ('
             .db_input($query)
-            .$mode.') ');
-        $fields = array($where[0] . ' AS `relevance`');
+            .$mode.')';
+        $tables = array("(
+            SELECT object_type, object_id, $search AS `relevance`
+            FROM `ost__search` `search`
+            WHERE $search
+        ) `search`");
 
         switch ($model) {
         case false:
         case 'Ticket':
-            $tables[] = ORGANIZATION_TABLE . " A4 ON (A4.id = `search`.object_id
-                AND `search`.object_type = 'O')";
-            $tables[] = USER_TABLE . " A3 ON ((A3.id = `search`.object_id
-                AND `search`.object_type = 'U') OR A3.org_id = A4.id)";
-            $tables[] = TICKET_THREAD_TABLE . " A2 ON (A2.id = `search`.object_id
-                AND `search`.object_type = 'H')";
-            $tables[] = TICKET_TABLE . " A1 ON ((A1.ticket_id = `search`.object_id
-                AND `search`.object_type='T')
-                OR (A4.id = A3.org_id AND A1.user_id = A3.id)
-                OR A3.id = A1.user_id
-                OR A2.ticket_id = A1.ticket_id)";
-            $fields[] = 'A1.`ticket_id`';
-            $key = 'ticket_id';
+            $P = TABLE_PREFIX;
+            $tables[] = "(select ticket_id as ticket_id from {$P}ticket
+            ) B1 ON (B1.ticket_id = search.object_id and search.object_type = 'T')";
+            $tables[] = "(select A2.id as thread_id, A1.ticket_id from {$P}ticket A1
+                join {$P}ticket_thread A2 on (A1.ticket_id = A2.ticket_id)
+            ) B2 ON (B2.thread_id = search.object_id and search.object_type = 'H')";
+            $tables[] = "(select A3.id as user_id, A1.ticket_id from {$P}user A3
+                join {$P}ticket A1 on (A1.user_id = A3.id)
+            ) B3 ON (B3.user_id = search.object_id and search.object_type = 'U')";
+            $tables[] = "(select A4.id as org_id, A1.ticket_id from {$P}organization A4
+                join {$P}user A3 on (A3.org_id = A4.id) join {$P}ticket A1 on (A1.user_id = A3.id)
+            ) B4 ON (B4.org_id = search.object_id and search.object_type = 'O')";
+            $key = 'COALESCE(B1.ticket_id, B2.ticket_id, B3.ticket_id, B4.ticket_id)';
+            $tables[] = "{$P}ticket A1 ON (A1.ticket_id = {$key})";
+            $cdata_search = false;
 
             if ($criteria) {
                 foreach ($criteria as $name=>$value) {
@@ -328,15 +333,12 @@ class MysqlSearchBackend extends SearchBackend {
 
             $sql = 'SELECT DISTINCT '
                 . $key
-                . ' FROM ( SELECT '
-                . implode(', ', $fields)
-                . ' FROM `'.TABLE_PREFIX.'_search` `search` '
-                . (count($tables) ? ' LEFT JOIN ' : '')
+                . ' FROM '
                 . implode(' LEFT JOIN ', $tables)
                 . ' WHERE ' . implode(' AND ', $where)
                 // TODO: Consider sorting preferences
                 . ' ORDER BY `relevance` DESC'
-                . ') __ LIMIT 500';
+                . ' LIMIT 500';
         }
 
         $res = db_query($sql);