2017-02-09 97 views
0

以下查询几乎是正确的,只是它会导致list_taxonomies表中的重复行。我只需要list_taxonomies表中的唯一行。我一直在努力解决一些解决方案,但似乎无法得到它。我已经试过了项目表上的左外部和内部联接。加入三个表导致重复记录

任何帮助表示赞赏。

查询:

SELECT 
    lists.*, 
    json_agg(items ORDER BY items.id) AS _items, 
    json_agg(list_taxonomies ORDER BY list_taxonomies.type) AS taxonomy 
FROM 
    lists 
JOIN 
    list_taxonomies ON list_taxonomies.list_id = lists.id 
JOIN 
    items ON items.list_id = lists.id 
WHERE 
    lists.id = 3 
GROUP BY 
    lists.id 

当前的结果:

{ 
    "status": "success", 
    "data": [{ 
     "id": 3, 
     "name": "tincidunt pede ac urna. Ut", 
     "description": "Lorem ipsum dolor sit amet, consectetuer adipiscing", 
     "created": "2016-08-24T12:00:00.000Z", 
     "updated": "2016-08-24T12:00:00.000Z", 
     "owner": 9, 
     "likes": 3, 
     "private": 0, 
     "location": "United States", 
     "nsfw": 0, 
     "_items": [{ 
      "id": 2, 
      "name": "sem semper", 
      "description": "sollicitudin commodo", 
      "list_id": 3, 
      "type": 2, 
      "image": "http://fillmurray.com/", 
      "list_order": 6, 
      "created": "2016-08-24T05:00:00-07:00", 
      "link": "http://amazon.com" 
     }, { 
      "id": 14, 
      "name": "magna sed", 
      "description": "bibendum. Donec felis", 
      "list_id": 3, 
      "type": 2, 
      "image": "http://fillmurray.com/", 
      "list_order": 1, 
      "created": "2016-08-24T05:00:00-07:00", 
      "link": "http://google.com" 
     }], 
     "taxonomy": [{ 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }, { 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }, { 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }, { 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }, { 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }, { 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }, { 
      "list_id": 3, 
      "taxonomy": "Art", 
      "type": 1 
     }] 
    }], 
    "message": "Retrieved list 1" 
} 
+0

与LEFT JOIN尝试 – McNets

+0

@McNets我已经尝试过,结果一样。 – jboneca

+0

应该是分类内部项目?因为双左连接应该起作用。 – McNets

回答

1

当从多个表汇总,然后汇总加盟之前:

SELECT 
    l.*, 
    i._items, 
    lt.taxonomy 
FROM lists l 
JOIN 
(
    select list_id, json_agg(list_taxonomies.* order by type) AS taxonomy 
    from list_taxonomies 
    group by list_id 
) lt ON lt.list_id = l.id 
JOIN 
(
    select list_id, json_agg(items.* order by id) AS _items 
    from items 
    group by list_id 
) i ON i.list_id = l.id 
WHERE l.id = 3; 
+0

这种情况对我很有意义,但查询失败,因为_items实际上并不是项目中的一列。 – jboneca

+0

不,不是。这是我们的json聚合项目的别名。我在这里没有看到缺陷。也许它需要'item'或者'items。*'而不是'json_agg(* order by id)''中的'*'?什么是你正在得到确切的错误信息? –

+0

我得到'_items'不存在。你说的没错,*本身就是导致错误的原因。一旦我改变了,那是对的。谢谢! – jboneca