2017-06-23 6 views
2

希望の値を返さない結合文があります。NULLの3回目の結合で値が返されない(コードシニター)

多くの場合、3番目のテーブル(cvi)には、4番目のテーブル(cmi)に一致する行が含まれないことがあります。値が結合されていない場合、結果は表cおよびcvからの希望値を表示しません。

/* Tables */ 
    $this->db->from($this->table_c.' c'); 
    $this->db->join($this->table_cv.' cv', 'cv.content_id = c.id', 'inner'); 
    $this->db->join($this->table_cvi.' cvi', 'cvi.version_id = cv.id AND cvi.meta_key = "M"'); 
    $this->db->join($this->table_cmi.' cmi', 'cmi.id = cvi.meta_value'); 

私は外部結合しようとしているが、テーブルcviがテーブルcvcmiとの間にあるので、2つのテーブルに共通の値が存在しません。

+------------+ 
|  c | 
|   | 
|  +-----|------+ 
|  |  | cv | 
+------------+  | 
     |  +------------+ 
     |  | | cvi | When this table is empty, the result is empty 
     +-------|----+  | I want it to still show result of c and cv 
       |  +------------+ 
       |  |  | cmi | 
       +------------+  | 
         |   | 
         |   | 
         +------------+ 

ここには共有値が存在しない理由が示されています。 したがって、cviに値が含まれている場合にのみ、cmiを結合する条件を作成する方法を探しています。それ以外の場合は、cviに外部結合のみを行い、テーブルは含めないでください。cmi

いくつかのアイデアや解決策を提供できますか?

EDIT ここで明確にするためのテーブルである。テーブルcvcmiにデータがある場合ここ

/* Table c */ 
+------+--------+ 
| id | title | 
+------+--------+ 

/* Table cv */ 
+------+----------+ 
| id | version | 
+------+----------+ 

/* Table cvi */ 
+------+------------+-----------+------------+ 
| id | version_id | meta_key | meta_value | 
+------+------------+-----------+------------+ 
/* when meta_key is 'M' then the meta_value will contain the cmi.id which is used for the join (regard it as meta_id) */ 
/* When this table is empty there won't be data in `cmi` either. When it's empty the join removes the data result that should be present from table `c`. */ 

/* Table cmi */ 
+------+-----------+------------+ 
| id | item_key | item_value | 
+------+-----------+------------+ 

結果です。あなたがleft joins取らなければならない私の意見で

Array (
     [0] => stdClass Object 
      (
       [id] => 5 /* This is c.id */ 
       [title] => Content title 
       [version_id] => 8 /* This is cv.id */ 
       [version] => 0 
       [meta_key] => M 
       [meta_value] => 23 /* (This is the id of the item below, cmi.id) */ 
       [item_key] => KEY1 
       [item_value] => Value 
      ) 
) 
+0

あなたはデータの例を示し、あなたはどのような結果セットを期待します説明できますか?現在、あなたは 'inner join'だけを持っていますので、結果は得られません(イラストを見てください)。 – zuluk

+0

'cv'に対応する行があるときに、テーブル' c'の行ごとに最小の結果が期待されます(この結合は図に示されていません)。したがって、 'c'と' cv'の間に内部結合があります。この内部結合は正しいものであり、すべての表に使用可能な値があれば正しい結果が得られます。しかし、3番目のテーブル 'cvi'に値がない場合、4番目のテーブル' cmi'へのリンクは「壊れています」、 'c'テーブルと' cv'テーブルの内部結合から値を削除します。 'cvi'と' cmi'テーブルから結合する値がなくても、これらは結果に残る必要があります。 – nicolaib

答えて

0

/* Tables */ 
$this->db->from($this->table_c.' c'); 
$this->db->join($this->table_cv.' cv', 'cv.content_id = c.id', 'inner'); 
$this->db->join($this->table_cvi.' cvi', 'cvi.version_id = cv.id AND cvi.meta_key = "M"', 'left'); 
$this->db->join($this->table_cmi.' cmi', 'cmi.id = cvi.meta_value', 'left'); 

をCVIとCMIのための条件を結合するが、任意の結果を作成していないのであれば、あなたは空の列を取得します。あなたのコメントの後

編集:たぶんEXISTSができます:

$this->db->where("EXISTS(SELECT * FROM cmi)"); 

Codeigniter subquery exists

+0

リンクテーブル 'cvi'に何もないときに、値が結合可能にならないので、問題は(私が見ているように)外側、内側、左側または右側の結合ではありません。私は 'cvi'テーブルの結果をテストするための解決策を見つけ、' cvi'に結果があれば 'cmi'に参加する必要があります。いくつかの状態のように。 – nicolaib

+0

おそらく、このhttps://stackoverflow.com/questions/25561306/codeigniter-subquery-existsが役立ちます。 – zuluk

+0

私はこれを試みましたが、これまで成功していませんでした。これでどのように解決できるか詳しく説明できますか?ちょうど私がサブクエリが残りのクエリが与えられたときにどのデータを選択するかを知る方法を理解していないからです。ありがとう。 – nicolaib

関連する問題