PHP & MySQL COUNT и ORDER BY найдены результаты - PullRequest
0 голосов
/ 31 марта 2012

У меня есть такой код:

function search_keyword(){       

        $keyword = $this->db->escape_like_str(trim($_POST['keyword']));

        $sql = " ( SELECT  name, id_global_info AS id, body AS body, tag AS tag  ,info_type_id AS info_type, \"global_info\" AS mytable FROM global_info WHERE ";
         $sql .= " MATCH (name, body, tag) AGAINST ( '$keyword') ";
          $sql .= " ) UNION ALL "; 

          $sql .= " ( SELECT name, id_person AS id, surname AS body, info AS tag , location AS info_type, \"person\" AS mytable FROM person WHERE ";
             $sql .= " MATCH (name, surname, info) AGAINST ( '$keyword' ) ";       

          $sql .= " ) UNION ALL ";

          $sql .= "( SELECT name, id_event AS id, body AS body, caffe_id AS tag , date AS info_type, \"event\" AS mytable FROM event WHERE ";
             $sql .= " MATCH (name, body) AGAINST ( '$keyword' ) ";             

        $sql .= " ) UNION ALL ";

          $sql .= "( SELECT name, id_caffe AS id, description AS body, adress AS tag, location_id AS info_type, \"caffe\" AS mytable FROM caffe WHERE ";
             $sql .= " MATCH (name, description) AGAINST ( '$keyword' ) ";           

        $sql .= " ) ";        
        $q = $this->db->query($sql);
         return $q = $q->num_rows() == 0 ? FALSE :  $q->result();
    }

Как подсчитать количество результатов в строке и затем упорядочить их по результату подсчета?

Пример: я хочу найти слово carпервый ряд имеет название автомобиля, а в кузове слово автомобиль появляется 7 раз, а во втором ряду автомобиль появляется 2 раза в кузове.Я хочу посчитать, сколько времени найдено слово «машина», а затем упорядочить результаты по этому результату.

1 Ответ

1 голос
/ 31 марта 2012

Я думаю, что лучше, если вы сделали это с помощью PHP:

$counters = array();
foreach($q->result as $r)
  $counters[$r['mytable']]++;

Поскольку я не знаю интерфейс вашей базы данных, это не точный код, но я полагаю, что вы можете получить общее представление (я предполагаю, что ваш объект набора результатов представляет собой массив ассоциативных массивов).

Edit:

Альтернативная схема

CREATE TABLE info_generic (id int not null auto_increment PRIMARY KEY, name varchar(100),
  record_type tinyint not null default 1, body TEXT, tag_id int , info_type_id int , 
  KEY (record_type) record_type,
  KEY(tag_id) tag_id,
  KEY(info_type_id) info_type_id
);

CREATE TABLE tags(id int not null auto_increment PRIMARY KEY,  description VARCHAR(100) );

CREATE TABLE info_types(id int not null auto_increment PRIMARY KEY, 
  description VARCHAR(100), record_type tinyint default 1 
);

Атрибуты объяснены

record_type: 1 -> global_info, 2 -> person, 3 -> event, 4 -> caffe

тело: 1 -> тело, 2 -> фамилия, 3 -> тело, 4 -> описание

тег: 1 -> тег, 2 -> информация, 3 -> тело, 4 -> описание

Затем вы можете создать отдельный SQL с помощью INNER JOINs для подачи записей в Sphinx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...