CI MySQL查询连接表和where语句不返回所有行

Posted

技术标签:

【中文标题】CI MySQL查询连接表和where语句不返回所有行【英文标题】:CI MySQL query join tables and where statement does not return all row 【发布时间】:2017-09-06 08:51:52 【问题描述】:

我有 3 个要加入的表,但是当我在第三个表上使用 where 语句,而第三个表没有它时,它不会从第一个和第二个表返回行,即使我' m 使用左连接。

Table 1
+---------+--------------+----------+
| acc_PID | acc_name     | acc_type |
+---------+--------------+----------+
|       1 | Account 1    |    1     |
|       2 | Account 2    |    1     |
|       3 | Account 3    |    2     |
|       4 | Account 4    |    1     |
+---------+--------------+----------+

Table 2
+-------------+-----------------+-----------+
| journal_PID | journal_account | trans_PID |
+-------------+-----------------+-----------+
|      1      |        1        |     1     |
|      2      |        2        |     2     |
|      3      |        1        |     3     |
+-------------+-----------------+-----------+

Table 3
+-----------+----------------+
| trans_PID | trans_location |
+-----------+----------------+
|     1     |       1        |
|     2     |       1        |
|     3     |       2        |
+-----------+----------------+

// CI query
$this->db->join('table_2 b', 'a.acc_PID = b.journal_account', 'LEFT');
$this->db->join('table_3 c', 'b.trans_PID = c.trans_PID', 'LEFT');
$this->db->where('a.acc_type', '1');
$this->db->where('c.trans_location', '1');
$this->db->group_by('a.acc_PID');
$query = $this->db->get('table_1 a');
$result = $query->result();

现在从上面的数据来看,如果我使用 ($this->db->where('c.trans_location', '1')),结果不会返回 Account 4,因为没有 acc_PID = 的数据'4' in table_2 和 table_3,但是我希望结果也返回 Account 4,即使表 2 和表 3 中没有帐户 4 的数据,没有 $this->db->where('c.trans_location', '1'),结果也显示帐户 4,但是使用 where location 语句,即使我使用左连接,它也不会返回表 1 中的行,它不应该也返回表 1 的结果吗?

提前谢谢你。

【问题讨论】:

尝试在 join 中添加条件,而不是在 where 子句中。 这可能会帮助你***.com/questions/15992236/… @AmiteshKumar 愚蠢的我!谢谢您,先生,请写下您的答案,以便我接受。 @AmiteshKumar 等等,如果我使用'LEFT',仍然没有显示表2和表3中没有数据的帐户,但如果我不使用'LEFT',它返回所有位置的所有 trans,而我只需要 trans_location ='1'; 【参考方案1】:

尝试在 Join 中添加条件,而不是在 where 子句中。 如果在 where 子句中写条件, 它会在连接之后添加条件意味着过滤后过滤,

或者不要使用左连接,最后添加 where 条件。

我没有发现表 1 与 tanle 2 或表 3 有任何关系。如果 journal_account 与表 1 有关系,那么它应该可以工作。

我自己尝试一下,这是我认为的解决方案:

SELECT * FROM `table1`

INNER JOIN table2 ON table2.journal_account = table1.acc_PID

INNER JOIN table3 ON table3.trans_PID = table2.trans_PID

WHERE table1.acc_type = 1  AND table3.trans_location = 1 GROUP BY table1.acc_PID

还有这个:

SELECT * FROM `table1`

INNER JOIN table2 ON table2.journal_account = table1.acc_PID

INNER JOIN table3 ON table3.trans_PID = table2.trans_PID AND table3.trans_location = 1

WHERE table1.acc_type = 1  GROUP BY table1.acc_PID

这会给我两个Accoun Account1和Account 2

希望这会对你有所帮助。

【讨论】:

感谢您的回答。关系是从 table_2.journal_account 到 table_1.acc_PID,所以我将 AND 添加为 $this->db->join(table_3 c', 'b,trans_PID = c.trans_PID AND c.trans_location=1');如果我不使用左连接,它不会返回在表 2 和表 3 中没有关系的帐户 4,如果我使用左连接,它会返回帐户 4,但也会导致表 3 中的 trans.location 不是 '1 '。 @Charas 我在我的答案中添加了查询,希望对您有所帮助,如果是,请接受答案。 是的,谢谢,事实证明你的代码工作得很好,是什么让我的结果返回 table_3 中的所有数据是因为我使用了 SELECT(SUM(CASE WHEN table_3 bla blac 并忘记添加 CASE WHEN AND transaction_location =1)。无论如何,非常感谢您的帮助。

以上是关于CI MySQL查询连接表和where语句不返回所有行的主要内容,如果未能解决你的问题,请参考以下文章

mysql的inner join,left jion,right join,cross join以及on和where的区别

mysql 表关联

错题纠正

MySQL-过滤数据(WHERE语句)

错题集07

hibernate错题解析