2012-01-24 20 views
0

私はPHPでCodeigniterフレームワークの下で実行しているアクティブレコードクエリを持っています。結合の特定の値が満たされます(トラックに関連付けられた「タグ」 - 各トラックには、複数のタグが関連付けられています)。選択したすべてのタグが関連付けられているトラックをクエリで探す方法があると、私は疑問に思っています。つまり、links.tag_idが1のすべてのトラックを取得し、links.tag_idが2のすべてのトラックを取得する代わりに、links.tag_idが1で、2からすべてのトラックを返します。減算クエリでは、選択した結果を追加するタグの数を減らします。ここで私はこれまで起こっているものです:すべての値が一致するMySQLクエリ(減算クエリ)

$this->db->select('tracks.id, 
         tracks.name AS name, 
         tracks.filename, 
         tracks.url_name, 
         tracks.file_path_high, 
         tracks.filesize, 
         tracks.categories, 
         tracks.duration, 
         tracks.folder, 
         links.tag_id, 
         SUM(links.weight) AS total_weight, 
         tag_data.tag_name'); 

$this->db->distinct(); 
$this->db->from('music AS tracks'); 
$this->db->where_in('links.tag_id', array('1', '2'); 
$this->db->join('linked_tags AS links', 'links.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data', 'tag_data.id = links.tag_id', 'inner'); 
+0

は、左の外側を探しているあなたのタグテーブルに参加しますか?あなたがデータベースを求めていることを完全に理解しているかどうかはわかりません。明確にすることはできますか? – Kevin

+0

申し訳ありませんが、まだ私の頭の中を包み込んでいます。私は、タグとトラックIDのリンクが上にある 'リンク'テーブルを持っています。各トラックには複数のタグがリンクされています。 1、2、5というタグではなく、そのトラックに関連付けられたタグ(リンクテーブルの別々の行にある)を持つすべてのトラックを取得したいとします。 – jpea

答えて

0

必要なものは、あなたがあなたのwhere句内の各タグのエイリアスを見つけて、使用する各タグのためにあなたのタグテーブルを何度も参加することです。例えば、私はこれを行うだろう:明らか

$this->db->select('...'); 
$this->db->distinct(); 
$this->db->from('music AS tracks'); 
//Tag 1 
$this->db->join('linked_tags AS links1', 'links1.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data1', 'tag_data1.id = links1.tag_id AND tag_data1.tag = "tag1"', 'inner'); 
//Tag 2 
$this->db->join('linked_tags AS links2', 'links2.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data2', 'tag_data2.id = links2.tag_id AND tag_data2.tag = "tag2"', 'inner'); 
//Tag 3 
$this->db->join('linked_tags AS links3', 'links3.track_id = tracks.id', 'inner'); 
$this->db->join('tags AS tag_data3', 'tag_data3.id = links3.tag_id AND tag_data3.tag = "tag3"', 'inner'); 

を、私はあなたの構造がどのようなものかわかりませんが、あなたは華麗な仲間だときっとあなたの構造に適応させる方法を理解します...

INNERは何度もLINKED_TAGSとTAGSテーブルを結合し、特定のタグに対してINNER JOINを強制します。特定のオブジェクトに対してタグが見つからない場合は、内部結合が失敗し、単純に返されません...あなたが望むが、明らかにある特定の時点で多くのJOINSを追加することができます。パフォーマンス。これと同じ手法を使用する方法の詳細たとえば

、次のポストを表示:

Advanced MySQL Joining. Speeding up query

幸運

関連する問題