如何避免 SQLite 中的 json_group_array 多次出现?

问题描述 投票:0回答:1

我在进行 Sqlite 查询时遇到问题,简单来说一下我的情况:假设我有这样的表

Project            Facility_category         Facility_item              Project_Facility_Relation
--------           --------                  --------                   ---------
id| name           id | name                 id | name                  id | project_id | category_id | item_id

-----------        ---------------------     ---------------------      ----------------
1 | Building A     1  | Relax Outdoor        1 | Square                 1 | 1 | 1 | 1
2 | Apartment B    2  | School               2 | Kid Zone               2 | 1 | 1 | 2
                                             3 | Swimming pool          3 | 1 | 1 | 3
                                             4 | High School A          4 | 1 | 2 | 4
                                             5 | University B           4 | 1 | 2 | 5
                   

现在我做了这样的查询:

SELECT pr.id, pr.name,
  (
  SELECT DISTINCT json_group_array(
    json_object('id', qu.id, 
    'name', qu.name, 
    'item',  
        (
            SELECT DISTINCT json_group_array(json_object('id',  ifi.id, 'name', ifi.name))
            FROM Project_Facility_Relation fa
            INNER JOIN Facility_item ifi ON ifi.id = fa.facility_id
            where fa.project_id = pr.id AND fa.qualily_id = qu.id
        )
    ))
  FROM Project_Facility_Relation fa
  INNER JOIN Facility_category qu ON qu.id = fa.qualily_id
  where fa.project_id = pr.id
  ) as Category
FROM Project pr
GROUP BY pr.id

问题出在我的结果中,类别列根据 Project_Facility_Relation 中存在的 Facility_category 数量运行多次。在本例中,“Relax Outdoor”在 Facility_category 中出现了 3 次,因此在 Category 结果中,有 3 个元素重复

Project   
--------   
id | name | Category
-----------      
1 |  Building A |  [
  {
    "id": "1",
    "name": "Relax Outdoor",
    "item": [
      {
        "id": "1",
        "name": "Square",
      },
      {
        "id": "2",
        "name": "Kid Zone",
      },
            {
        "id": "3",
        "name": "Swimming pool",
      },
    ]
  },
    {
    "id": "1",
    "name": "Relax Outdoor",
    "item": [
      {
        "id": "1",
        "name": "Square",
      },
      {
        "id": "2",
        "name": "Kid Zone",
      },
            {
        "id": "3",
        "name": "Swimming pool",
      },
    ]
  },
    {
    "id": "1",
    "name": "Relax Outdoor",
    "item": [
      {
        "id": "1",
        "name": "Square",
      },
      {
        "id": "2",
        "name": "Kid Zone",
      },
            {
        "id": "3",
        "name": "Swimming pool",
      },
    ]
  },
  {
    "id": "2",
    "name": "School",
    "item": [
      {
        "id": "4",
        "name": "High School A",
      },
      {
        "id": "5",
        "name": "University B",
      },
    ]
  },
    {
    "id": "2",
    "name": "School",
    "item": [
      {
        "id": "4",
        "name": "High School A",
      },
      {
        "id": "5",
        "name": "University B",
      },
    ]
  }
]

请帮助我,告诉我我错在哪里?非常感谢

sql sqlite pocketbase
1个回答
0
投票
SELECT pr.id, pr.name,
  (
  SELECT json_group_array(
    json_object('id', qu.id, 
    'name', qu.name, 
    'item',  
        (
            SELECT json_group_array(json_object('id',  ifi.id, 'name', ifi.name))
            FROM Project_Facility_Relation fa
            INNER JOIN Facility_item ifi ON ifi.id = fa.item_id
            WHERE fa.project_id = pr.id AND fa.category_id = qu.id
        )
    ))
  FROM Facility_category qu
  WHERE EXISTS (
      SELECT 1
      FROM Project_Facility_Relation fa
      WHERE fa.qualily_id = qu.id AND fa.project_id = pr.id
  )
  ) as Category
FROM Project pr;

您似乎在

Category
列中获得了重复的条目,因为您的内部子查询与外部查询没有正确关联

© www.soinside.com 2019 - 2024. All rights reserved.