2012-03-31 6 views
0

を見つけた私はこのようなコードを持っている:PHP&MySQLのCOUNTとORDERが

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(); 
    } 

をどのように私は、行ごとの結果の数をカウントして、カウント結果によってそれらを注文することができますか?

例:名前車を持っていて、車には名前の車があり、車には単語車が7回、2列目に車が2回現れています。私はどのくらい多くの時間の車が見つけられたのかを数え、その結果によって結果を注文したいと思う。

+8

叫び、データベース、叫び声。 –

+0

私は質問を更新しました。 OZ私はMySQLの初心者です。今のところこの方法は私のために働いていますが、もう少しMySQLを学ぶと、私はそのクエリをリメイクします。いずれにしても、クエリを修正する方法はありますか? – Sasha

+0

PHPを使用した方が良いと思います。 – wisefish

答えて

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説明: - > global_info、2 - >人、3 - >イベント、4 1 - > caffe

本文:1 - >体、 2 - >姓、3 - >ボディ、4 - >説明

タグ:1 - >タグ、2 - >情報、3 - >ボディ、4 - >説明

あなたは、単一のSQLを構築することができますINNER JOINsを使用してレコードをSphinxにフィードします。

+0

それは働いています。しかし、OZのコメントが好きな人の数から、私はMySQLの部分に間違ったことをしていると思います。できるだけ早く変更する必要があります。ありがとうございました:) – Sasha

+1

共通の類似した属性を持つオブジェクトに対して異なるテーブルを使用している可能性があります。 1つのテーブルにそれらを組み合わせることができ、この複雑なUNIONクエリを実行する手間を省くことができます。他の解決策の1つは、スキーマを変更することです。同時に、http://sphinxsearch.comなどのフルテキスト検索エンジンを使用しています。注:コメントのためにあまりにも多くの情報ですので、私は私の答えを編集しました:)。 – wisefish

+0

クール:)。情報ありがとうございます:) – Sasha