【问题标题】:PHP & MySQL COUNT and ORDER BY results found找到 PHP & MySQL COUNT 和 ORDER BY 结果
【发布时间】:2012-03-31 17:52:57
【问题描述】:

我有这样的代码:

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 - 第一排有名字 car,并且在正文中出现了 7 次 car,在第二排中出现了 2 次 car。我想计算找到单词 car 的次数,然后按该计数结果对结果进行排序。

【问题讨论】:

  • 哭,数据库,哭。
  • 我更新了问题。 OZ 我只是 MySQL 的初学者。目前这种方式对我有用,但是当我更多地学习 MySQL 时,我将重新制作查询。无论如何,您对如何修复查询有什么建议吗?
  • 我认为你最好使用 PHP:
  • “每行”是什么意思?您是指每个联合查询吗?

标签: php mysql codeigniter-2


【解决方案1】:

我认为你最好使用 PHP:

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

由于我不知道您的数据库接口,这不是确切的代码,但我相信您可以大致了解(我假设您的结果集对象是关联数组的数组)。

编辑:

备用架构

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

body : 1 -> body , 2 -> surname , 3 -> body , 4 -> description

标签:1 -> 标签,2 -> 信息,3 -> 正文,4 -> 描述

然后,您可以使用 INNER JOIN 构造单个 SQL,将记录提供给 Sphinx。

【讨论】:

  • 它正在工作。但从 OZ 评论获得的点赞数来看,我认为我在 MySQL 部分做错了,我需要尽快对其进行更改。谢谢你的帮助:)
  • 我们可以在您的架构上注明,您可能对具有共同和相似属性的对象使用不同的表。您可以将它们组合到一个表中,从而省去执行这个复杂的 UNION 查询的麻烦。另一种解决方案是更改您的架构,同时使用全文搜索引擎,例如 sphinxsearch.com 。注意:我已经编辑了我的答案,因为评论信息太多了:)。
猜你喜欢
  • 2014-10-21
  • 2012-05-06
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
相关资源
最近更新 更多