Postgresql array_agg,INNER JOIN和LEFT JOIN问题

时间:2014-01-13 23:14:18

标签: sql postgresql join left-join inner-join

我的一个查询有点问题。此查询的目标是获取用户的所有table1项及其信息。如您所见,数据模型非常复杂(有充分理由),这需要一个大查询(我的目标是仅使用一个查询收集所有内容)。

以下是数据模型:

model

我想要的是什么:

  • 所有T1信息
  • 一个T1项目的所有T2信息(它是1到n的关系,所以我将使用array_agg)
  • 一个T1项目的所有T3信息
  • 一个T1项目的所有T4信息
  • 一个T1项目的所有T6信息
  • i18n关于T1迭代的信息

这是table1_table2和table4_table6 SELECT *:

   table1_id | table2_id
-------------+---------------
 item2id     | table2item1
 item4id     | table2item2
 item4id     | table2item1
 item5id     | table2item3
 item5id     | table2item2

   table4_id      | table6_id
------------------+--------------------
 table4item1      | table6item1
 table4item1      | table6item2
 table4item2      | table6item2
 table4item3      | table6item3
 table4item1      | table6item3
 table4item2      | table6item3

以下是带有id及其外键的Table1 SELECT。

 table1_id | table3_id
------------------------
 item1id   | table3item1
 item2id   | table3item1
 item6id   | table3item4
 item3id   | table3item2
 item4id   | table3item2
 item5id   | table3item3

同样的表3:

  table3_id  |  table4_id
------------+--------------
 table3item1 | table4item1
 table3item4 | table4item1
 table3item2 | table4item2
 table3item3 | table4item3

最后,这是我的问题:

SELECT t1.id,
na.name,
array_to_json(array_agg(row_to_json(t2))) AS table2items,
array_to_json(array_agg(row_to_json(t6))) AS table6items
FROM table1 t1
INNER JOIN table1_i18n na ON na.table1_id = t1.id
INNER JOIN table3 t3 ON t3.id = t1.table3_id
INNER JOIN table4 t4 ON t4.id = t3.table4_id
LEFT JOIN table1_table2 t1t2 ON t1t2.table1_id = t1.id
LEFT JOIN table2 t2 ON t2.id = t1t2.table2_id
LEFT JOIN table4_table6 t5_t6 ON t5_t6.table5_id = t3.table4_id
LEFT JOIN table6 t6 ON t6.id = t5_t6.table6_id
WHERE t1.user_id = 'myuserid' AND na.lang = 'en_US'
GROUP BY t1.id, na.name, t4.id
ORDER BY t1.id;

结果如下:

     id      |     name     |   table3_id  |  table4_id  |           table2items                                                                                                                             |  table6items
-------------+------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 item1id     | MyFirstItem  |  table3item1 | table4item1 | [null,null,null]                                                                                                                                  | [{"id":"table6item1"},{"id":"table6item2"},{"id":"table6item3"}]
 item2id     | MySecondItem |  table3item1 | table4item1 | [{"table2item1","data1":"damage","data2":10},{"id":"table2item1","data1":"damage","data2":10},{"id":"table2item1","data1":"damage","data2":10}]   | [{"id":"table6item1"},{"id":"table6item2"},{"id":"table6item3"}]
 item3id     | MyThirdItem  |  table3item2 | table4item2 | [null,null]                                                                                                                                       | [{"id":"table6item2"},{"id":"table6item3"}]
 item4id     | MyFourthItem |  table3item2 | table4item2 | [{"id":"table2item2","data1":"range","data2":20},{"id":"table2item1","data1":"damage","data2":10},{"id":"table2item2","data1":"range","data2":20},{"id":"table2item1","data1":"damage","data2":10}] | [{"id":"table6item2"},{"id":"table6item3"},{"id":"table6item3"},{"id":"table6item2"}]
 item5id     | MyFifthItem  |  table3item3 | table4item3 | [{"id":"table2item3","data1":"range","data2":20},{"id":"table2item2","data1":"range","data2":20}]                                                 | [{"id":"table6item3"},{"id":"table6item3"}]
 item6id     | MySixthItem  |  table3item4 | table4item1 | [null,null,null]                                                                                                                                  | [{"id":"table6item2"},{"id":"table6item1"},{"id":"table6item3"}]

嗯,我在这里遇到了问题。如您所见,我的table2_items和table6_items数组具有相同的大小。我不知道这个的原因,但似乎我错过了什么。 更糟糕的是,此查询不是使用空值填充此数组,而是创建不应出现的重复项。

详细信息:

  • item1和item6有同样的问题:没有到table2的链接,以及table6中的3个项目。我最终得到了table2_items
  • 的数组[null,null,null]
  • item2有3个链接到表6,1到表2。我最终得到了数组中相同table2对象的3倍
  • item4 ......我不知道这里发生了什么。每个阵列应该有两件事,我有4件(重复)
  • 第5项:你可以清楚地看到重复。

我尝试按table6.id或table2.id进行分组。它不起作用(我每个都有一行,所以每个项目有几行)。

注意:如果我这样做

SELECT t1.id,
na.name,
array_to_json(array_agg(row_to_json(t2))) AS table2items,
FROM table1 t1
INNER JOIN table1_i18n na ON na.table1_id = t1.id
INNER JOIN table3 t3 ON t3.id = t1.table3_id
INNER JOIN table4 t4 ON t4.id = t3.table4_id
LEFT JOIN table1_table2 t1t2 ON t1t2.table1_id = t1.id
LEFT JOIN table2 t2 ON t2.id = t1t2.table2_id
WHERE t1.user_id = 'myuserid' AND na.lang = 'en_US'
GROUP BY t1.id, na.name, t4.id
ORDER BY t1.id;
仅此一项,它完美无缺。对于t6也是如此。只有在我尝试收集所有内容的同时,我才会遇到一些问题。

如果不够清楚,请询问详细信息。解释这样的问题真的不容易:)。

0 个答案:

没有答案