簡體   English   中英

同一張表的一對多關系,如何返回每個子級別?

[英]One-to-many relationship on same table, how to return each sub level?

我對同一張表上的一對多關系有疑問。

所以我有這兩個表:

CREATE TABLE IF NOT EXISTS public.djangoadmin_animal
(
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
    name character varying(100) COLLATE pg_catalog."default" NOT NULL,
    slug character varying(100) COLLATE pg_catalog."default" NOT NULL,
    description text COLLATE pg_catalog."default" NOT NULL,
    images character varying(100) COLLATE pg_catalog."default" NOT NULL,
    date_create timestamp with time zone NOT NULL,
    date_update timestamp with time zone NOT NULL,
    category_id bigint NOT NULL,
    CONSTRAINT djangoadmin_animal_pkey PRIMARY KEY (id),
    CONSTRAINT djangoadmin_animal_category_id_3d95d2d9_fk_djangoadm FOREIGN KEY (category_id)
        REFERENCES public.djangoadmin_category (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        DEFERRABLE INITIALLY DEFERRED
)

CREATE TABLE IF NOT EXISTS public.djangoadmin_category
(
    id bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ),
    name character varying(100) COLLATE pg_catalog."default" NOT NULL,
    slug character varying(100) COLLATE pg_catalog."default" NOT NULL,
    description text COLLATE pg_catalog."default" NOT NULL,
    images character varying(100) COLLATE pg_catalog."default" NOT NULL,
    date_create timestamp with time zone NOT NULL,
    date_update timestamp with time zone NOT NULL,
    category_id bigint,
    CONSTRAINT djangoadmin_category_pkey PRIMARY KEY (id),
    CONSTRAINT djangoadmin_category_category_id_9b327c27_fk_djangoadm FOREIGN KEY (category_id)
        REFERENCES public.djangoadmin_category (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        DEFERRABLE INITIALLY DEFERRED
)

這是來自表 public.djangoadmin_category 的一些示例數據:

11  "zoogdieren"    "zoogdieren"    "hoi"   "photos/categories/1_eDJtmdP.jpg"   "2023-01-27 18:25:18.624272+01" "2023-01-27 18:25:18.624272+01" 
12  "amfibieen" "amfibieen" "kujhkjh"   "photos/categories/1_KJDTBPc.jpg"   "2023-01-27 18:25:38.444066+01" "2023-01-27 18:25:38.444066+01" 
13  "vogels"    "vogels"    "kljhkjh"   "photos/categories/1_FGkA44b.jpg"   "2023-01-27 18:26:00.390812+01" "2023-01-27 18:26:00.390812+01" 
16  "roofvogels"    "roofvogels"    "kljhkljjl" "photos/categories/1_pA0TNrX.jpg"   "2023-01-27 18:29:16.101478+01" "2023-01-27 18:29:16.102479+01" 13
17  "kikkers"   "kikkers"   "kjhkjh"    "photos/categories/1_zk2WQLP.jpg"   "2023-01-27 18:29:44.073516+01" "2023-01-27 18:29:44.073516+01" 12
21  "reptielen" "reptielen" "reptielen" "photos/categories/1_EoVggfL.jpg"   "2023-01-27 18:55:04.565339+01" "2023-01-27 18:55:04.565339+01" 
22  "slangen"   "slangen"   "slangen"   "photos/categories/1_w4pzls7.jpg"   "2023-01-27 18:55:23.181336+01" "2023-01-27 18:55:23.181336+01" 21
23  "schildpadden"  "schildpadden"  "schildpadden"  "photos/categories/1_RkKQ5md.jpg"   "2023-01-27 18:55:51.724641+01" "2023-01-27 18:55:51.724641+01" 
24  "honden"    "ohhhh" "hhhh"  "photos/categories/1_iUcB8K5.jpg"   "2023-01-27 19:24:35.589541+01" "2023-01-27 19:24:35.590538+01" 11
25  "katten"    "kjhkjh"    "kjhkjh"    "photos/categories/1_5LxINWC.jpg"   "2023-01-27 19:24:48.07098+01"  "2023-01-27 19:24:48.07098+01"  11
26  "olifanten" "olifanten" "kjhkjhkjh" "photos/categories/1_kmRFovt.jpg"   "2023-01-27 19:25:05.648655+01" "2023-01-27 19:25:05.648655+01" 11
27  "krokodillen"   "krokodillen"   "l;l;'ll;;'l"   "photos/categories/1_YuCHCct.jpg"   "2023-01-27 19:27:18.06109+01"  "2023-01-27 19:27:18.06109+01"  12

這是一些解釋:

所以有主要的群體:

  • zoogdieren(哺乳動物)
  • amfibieen(兩棲動物)
  • vogels(鳥類)

你有一個類別:

  • 本登(狗)
  • 貓(貓)

他們屬於主要群體:zoogdieren(哺乳動物)

我的具體問題是:

是否可以用這種關系編寫查詢以獲取所有主要組並獲取所有類別?

所以對 main group 的查詢將是 output:

  • zoogdieren(哺乳動物)
  • amfibieen(兩棲動物)
  • vogels(鳥類)

查詢例如 zoogdieren(mammals) 將是:

  • 本登(狗)
  • 貓(貓)

我認為這是不可能的。 或者是嗎? 我這樣嘗試:

SELECT
    A.name, A.category_id, B.name, B.category_id
FROM 
    djangoadmin_category A, djangoadmin_category B
WHERE 
    A.category_id = B.category_id
    AND A.name = B.name
ORDER BY 
    A."name"

如果我理解正確的話。 你有這個數據庫結構

Animal(Honden) --> Category(Dog) --> Category (Mammal) 這只是一個表中類別的層次結構,而另一個表中的動物屬於層次結構中任何位置的類別

你呈現的是一個非常簡單的 output,是你想要的 output 還是你想要一個 output 沿着層次結構向上走到樹的頂部?

你想要的最終 output 是什么,看起來你想要的 output 是 Animal --> Category 這是一個簡單的連接。 沿着樹向上查找主要類別有點復雜,但在大多數 SQL 引擎中非常簡單。 不同的引擎有不同的 SQL 來上樹或下樹。 查找 Oracle 的 CONNECT BY JOIN 或 PostgreSQL 的公用表表達式以獲取線索

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM