2011-03-04 5 views
5

に参加します。 'work'テーブルには1または0の値を持つ 'draft'カラムがあります。特定のタグを使った作業がドラフトモード(1)であるかどうかをCOUNT(tags.id)に記録します。CodeIgniterの - アクティブレコードの - - SQLの複合体は、私はテーブルからすべてのタグを取得する機能を持っている

たとえば、「デザイン」というタグが付けられた10個の作品があるとします。 COUNTは10になりますが、これらの作業のうち2つはドラフトモードなので、COUNTは実際には8になります。これはどのように管理しますか?

+1

いつもバニラSQLに切り替えることができます。 – janosrusiczki

+1

念のため、クエリーに '*'セレクタを使用しないようにする必要があります。これは良い方法ではありません。常に返すカラム名を定義してください。*決して* SELECT * FROM ... do – Jakub

答えて

7

変更してみてください:

$this->db->from('tags'); 
$this->db->join('tags_to_work', 'tags.id = tags_to_work.tag_id'); 

へ:

$this->db->from('tags, work'); 
$this->db->join('tags_to_work', 'tags.id=tags_to_work.tag_id AND work.id=tags_to_work.work_id'); 

そして追加:

$this->db->where('work.drafts', 0); 
+0

ありがとう、しかし、 'tag_id'列を持つ作業表ではありませんが、それはtag_to_work表です。私は試しました:$ this-> db-> join( 'tags_to_work AS ttw'、 'work.id = ttw.work_id AND work.draft = 0');私は1の代わりに33、2の代わりに66を得ています! – Jack

+0

@Jack:これは動作しますか? (編集ポストを参照) –

+0

マジック、それは動作します! – Jack

2

をあなたが代わりにアクティブレコードクラスを使用しての純粋なSQLを使用することができ、私自身が働いています私は2年間以上のCIと、私はアクティブなレコードクラスを回避している時間のほとんどは、ストレートSQLは非常にデバッグが簡単です複雑なクエリを書く。 これは私がそれを使う方法です。

 
$sql = "SELECT...your sql here"; 
$q = $this->db->query($sql); 
... 
//Do something with your query here 
関連する問題