左联接(如果存在且存在)

时间:2018-06-26 09:08:24

标签: mysql

我有多个表,第一个包含一个值,另一个应存在(如果存在),值和active状态为一个:

        Table 1
+------+-------+--------+
|  id  | value | active |
+------+-------+--------+
|  1   |   v1  |    1   |
|  2   |   v2  |    1   |
|  3   |   v3  |    1   |
+------+-------+--------+

             Table 2                              Table 3             
+------+-------+-------+--------+    +------+-------+-------+--------+
|  id  | link  | value | active |    |  id  | link  | value | active |
+------+-------+-------+--------+    +------+-------+-------+--------+
|  1   |   1   |  v21  |    1   |    |  1   |   1   |  v31  |    1   |
|  2   |   2   |  v22  |    0   |    |  2   |   2   |  v32  |    1   |
|  3   |   3   |  v23  |    1   |    +------+-------+-------+--------+
+------+-------+-------+--------+    

现在,我想将Table 1扩展为包含Table 2Table 3的值(如果有值且值为active=1)。结果表应如下所示:

             Result 
+------+-------+-------+--------+
|  id  | value | tbl 2 | tbl 3  |
+------+-------+-------+--------+
|  1   |   v1  |  v21  |   v31  |  -- values exist in every table
|  2   |   v2  |  NULL |   v32  |  -- active is 0 in Table 2 -> value tbl 2 = NULL
|  3   |   v3  |  v23  |   NULL |  -- value does not exist in Table 3 -> value tbl 3 = NULL
+------+-------+-------+--------+

我尝试了查询

SELECT SQL_CALC_FOUND_ROWS 
    `Table 1`.*, 
    IF(`Table 2`.`active` = 1, `Table 2`.`value`, NULL) AS tbl2, 
    IF(`Table 3`.`active` = 1, `Table 3`.`value`, NULL) AS tbl3
FROM 
    `Table 1` 
LEFT JOIN 
    `Table 2` ON `Table 1`.`id` = `Table 2`.`link`
LEFT JOIN 
    `Table 3` ON `Table 1`.`id` = `Table 3`.`link`
WHERE 
    `Table 1`.`active` = 1 
LIMIT <limit> OFFSET <offset>

这有效并给出了预期的结果。但是放入SQL_CALC_FOUND_ROWS之后,需要花费很长时间。我的Table 1有2000多个值,而且我不仅要加入Table 2Table 3,还要加入另外10个表。他们也有2000多个记录。

我在link列和Table 1.id列上都有一个索引。

如何加快查询速度?这是最快的方法吗?

我想知道,因为我没想到MYSQL在2000行时会出现性能问题。但是我在MYSQL方面并不出色,所以这可能是最糟糕的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

Arel
相关问题