MySql查詢-自關(guān)聯(lián)

  • 設(shè)計省信息的表結(jié)構(gòu)provinces

    • id
    • ptitle
  • 設(shè)計市信息的表結(jié)構(gòu)citys

    • id
    • ctitle
    • proid
  • citys表的proid表示城市所屬的省,對應(yīng)著provinces表的id值

問題:

能不能將兩個表合成一張表呢?

思考:

觀察兩張表發(fā)現(xiàn),citys表比provinces表多一個列proid,其它列的類型都是一樣的

意義:

存儲的都是地區(qū)信息,而且每種信息的數(shù)據(jù)量有限,沒必要增加一個新表,或者將來還要存儲區(qū)、鄉(xiāng)鎮(zhèn)信息,都增加新表的開銷太大

答案:

定義表areas,結(jié)構(gòu)如下

  • id
  • atitle
  • pid

說明:

  • 因為省沒有所屬的省份,所以可以填寫為null
  • 城市所屬的省份pid,填寫省所對應(yīng)的編號id
  • 這就是自關(guān)聯(lián),表中的某一列,關(guān)聯(lián)了這個表中的另外一列,但是它們的業(yè)務(wù)邏輯含義是不一樣的,城市信息的pid引用的是省信息的id
  • 在這個表中,結(jié)構(gòu)不變,可以添加區(qū)縣、鄉(xiāng)鎮(zhèn)街道、村社區(qū)等信息

創(chuàng)建areas表的語句如下:

create table areas(
    aid int primary key,
    atitle varchar(20),
    pid int
);

  • 從sql文件中導(dǎo)入數(shù)據(jù)
source areas.sql;

示例:
-- 自關(guān)聯(lián)

    -- 查詢所有省份
    select * from areas where pid = 1;

    -- 查詢山東省有哪些市
    select id from areas where name = "山東省"; -- 查詢id
    select * from areas where pid = 17;

     -- 查詢山東省有哪些市 一步查詢
     -- 一個表可以通過 as 重命名為兩個表
    select province.name,city.name from areas as province inner join areas as city on province.id = city.pid having province.name="山東省";
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容