public function havingString()
 {
     $ret = '';
     if (is_array($this->having) && count($this->having)) {
         foreach ($this->having as $having_data) {
             if (is_numeric($having_data['value'])) {
                 $value = $having_data['value'];
             } else {
                 $value = '\'' . $having_data['value'] . '\'';
             }
             if ($having_data['table']) {
                 $field_string = $having_data['table'] . '.' . $having_data['field'];
             } else {
                 $field_string = $having_data['field'];
             }
             if ($having_data['function']) {
                 $field_string = $having_data['function'] . '(' . $field_string . ')';
             }
             $cur_str = $field_string . ' ' . Clause::getStringSeparator($having_data['type']) . ' ' . $value;
             if ($ret) {
                 $ret = '(' . $ret . ') ' . Clause::relateHowToString($having_data['relate_how']) . ' (' . $cur_str . ')';
             } else {
                 $ret = $cur_str;
             }
         }
         $ret = ' HAVING(' . $ret . ')';
     } else {
         if ($this->having) {
             throw new Exception('Incorrect having clause: ' . $this->having);
         }
     }
     return $ret;
 }