希望の値を返さない結合文があります。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
がテーブルcv
とcmi
との間にあるので、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 ここで明確にするためのテーブルである。テーブルcv
とcmi
にデータがある場合ここ
/* 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
)
)
あなたはデータの例を示し、あなたはどのような結果セットを期待します説明できますか?現在、あなたは 'inner join'だけを持っていますので、結果は得られません(イラストを見てください)。 – zuluk
'cv'に対応する行があるときに、テーブル' c'の行ごとに最小の結果が期待されます(この結合は図に示されていません)。したがって、 'c'と' cv'の間に内部結合があります。この内部結合は正しいものであり、すべての表に使用可能な値があれば正しい結果が得られます。しかし、3番目のテーブル 'cvi'に値がない場合、4番目のテーブル' cmi'へのリンクは「壊れています」、 'c'テーブルと' cv'テーブルの内部結合から値を削除します。 'cvi'と' cmi'テーブルから結合する値がなくても、これらは結果に残る必要があります。 – nicolaib